ค้นหาเว็บไซต์

typescript - สร้างฟิลด์ที่หายไปเมื่อแปลงจาก JSON


ถ้าฉันมีคลาสเช่น:

export interface Results {
  xrf: any;
  ftir: any;
  level: any;
}

export class myClass{
  Results: Results;
  remark: string;
}

และวัตถุ JSON เช่น:

{
  "Results": {
    "xrf" : "xrfresult",
    "level": "21"
  },
  "remark" : "Test 1"
}

ถ้าฉันทำการแยกวิเคราะห์อ็อบเจ็กต์โดยใช้ let obj: myClass=JSON.parse(jsonobj) อ็อบเจ็กต์จะไม่มีฟิลด์ ftir มีวิธีใดบ้างที่จะสร้างฟิลด์ที่หายไปโดยอัตโนมัติจากอ็อบเจ็กต์ JSON ที่ไม่มีทุกฟิลด์ของคลาส TypeScript?

คำตอบ #1

ไม่ใช่ทุกคุณสมบัติของอินเทอร์เฟซที่จะต้องมีอยู่ คุณสมบัติบางอย่างมีอยู่ภายใต้เงื่อนไขบางประการหรืออาจจะไม่อยู่เลย คุณสมบัติเสริมเหล่านี้เป็นที่นิยมเมื่อสร้างรูปแบบเช่น "กระเป๋าตัวเลือก" ที่คุณส่งวัตถุไปยังฟังก์ชันซึ่งมีเพียงบางคุณสมบัติที่ถูกเติม

อินเทอร์เฟซที่มีสมบัติเป็นทางเลือกจะถูกเขียนเหมือนกับอินเทอร์เฟซอื่น ๆ โดยแต่ละสมบัติที่เป็นทางเลือกจะถูกระบุด้วย ? ที่ท้ายชื่อสมบัติในประกาศ

ใน ftir ของคุณเป็นทางเลือกเพราะวัตถุอินพุตไม่มีคุณสมบัตินี้ หากคุณพยายามเข้าถึง ftir หลังจากการกำหนดวัตถุ คุณจะได้รับค่า undefined

export interface Results {
  xrf?: any;
  ftir?: any;
  level?: any;
}

export class myClass{
  Results: Results;
  remark: string;
}


export class HomePage {
  results : Results;
  jsonObj : myClass;
  jsonString : any;
  ftir : any;
  constructor(public navCtrl: NavController) {
    this.jsonObj={
  "Results": {
    "xrf" : "xrfresult",
    "level": "21"
  },
  "remark" : "Test 1"
}

this.ftir=this.jsonObj.Results.ftir
  this.jsonString=JSON.stringify(this.jsonObj);
  console.log(this.ftir);
  }

}

คำตอบ #2

ไม่ ไม่มีวิธีในตัวที่จะทำเช่นนี้ JSON ทำงานกับวัตถุธรรมดา การระบุประเภทของคุณไม่มีผลในเวลารันไทม์ ประเภททั้งหมดจะถูกลบ และอนุญาตได้เพียงเพราะ JSON.parse ไม่ได้คืนค่าประเภทเฉพาะ มันคืนค่า any

มันเป็นความคิดที่แย่มากที่จะใช้คำอธิบายประกอบของประเภทคลาสบนการอ้างอิงไปยังค่าที่ถูกดีสซีเรียลไลซ์

แม้ว่าคุณสามารถทฤษฎีแล้วสร้างฟังก์ชันที่สร้างอินสแตนซ์ของคลาสของคุณได้ แต่คุณจะต้องทำด้วยตนเองที่แต่ละจุดเรียกใช้หรือเปลี่ยนพฤติกรรมของวัตถุ JSON ระดับโลก วิธีหลังจริง ๆ แล้วไม่สามารถใช้ได้เพราะคุณจะทำลายการพึ่งพาของคุณ และวิธีแรกกลายเป็นฝันร้ายในการบำรุงรักษาที่นำความซับซ้อนอย่างมากเข้ามาทันทีที่คุณหลีกเลี่ยงไม่ได้ที่จะเพิ่มค่าที่ซ้อนกัน

ดังนั้น คุณไม่ควรใช้คลาส แต่ควรใช้อินเทอร์เฟซ ยิ่งไปกว่านั้น ตามที่ได้แนะนำในคำตอบอื่น คุณควรทำเครื่องหมายสมาชิกที่อาจจะไม่อยู่เป็นแบบทางเลือก

คุณจะต้องจัดเตรียมค่าดีฟอลต์ด้วยตัวเอง