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 ระดับโลก วิธีหลังจริง ๆ แล้วไม่สามารถใช้ได้เพราะคุณจะทำลายการพึ่งพาของคุณ และวิธีแรกกลายเป็นฝันร้ายในการบำรุงรักษาที่นำความซับซ้อนอย่างมากเข้ามาทันทีที่คุณหลีกเลี่ยงไม่ได้ที่จะเพิ่มค่าที่ซ้อนกัน
ดังนั้น คุณไม่ควรใช้คลาส แต่ควรใช้อินเทอร์เฟซ ยิ่งไปกว่านั้น ตามที่ได้แนะนำในคำตอบอื่น คุณควรทำเครื่องหมายสมาชิกที่อาจจะไม่อยู่เป็นแบบทางเลือก
คุณจะต้องจัดเตรียมค่าดีฟอลต์ด้วยตัวเอง
