json - วิธีสร้างอินเทอร์เฟซ TypeScript ที่มีทั้งลายเซ็นดัชนีและคุณสมบัติคงที่ที่มีชนิดต่างกัน?
จาก API เก่าฉันได้รับการตอบกลับเป็น JSON ดังนี้:
const someObject = {
"general": {
"2000": 50,
"4000": 100,
"8000": 200,
},
"foo": [
0,
1,
2,
],
"bar": [
5,
7,
],
"baz": [
8,
9,
],
};
โปรดจำไว้ว่า ดัชนีทั้งหมดยกเว้น "ทั่วไป" เป็นแบบไดนามิกและอาจไม่มีในคำตอบ ฉันไม่สามารถพิมพ์สำหรับแต่ละคุณสมบัติได้ แต่ต้องใช้ลายเซ็นดัชนี
ฉันต้องการทำให้สำเร็จผ่าน [email :
interface ISomeObject {
general: {
[index: string]: number;
};
[index: string]?: number[];
}
เนื่องจาก general จะอยู่ในคำตอบเสมอ แต่ดัชนีอื่นๆ อาจจะมีหรือไม่มีอยู่ก็ได้
ปัญหาที่ฉันกำลังเผชิญ:
- ฉันไม่สามารถทำให้
[index: string]?: number[]เป็นทางเลือกได้เพราะมันจะแจ้งเตือนว่ามีการใช้ number เป็นค่าที่นี่ [index: string]: number[]จะเขียนทับการกำหนดของgeneral: numberและดังนั้น tsc จะร้องเรียน:Property 'general' of type '{ [index: string]: number; }' is not assignable to string index type 'number[]'.`
ฉันสามารถพิมพ์สำหรับรูปแบบนี้ด้วยอินเทอร์เฟซ TypeScript ได้หรือไม่?
คำตอบ #1
นี่คือการแปรผันของแนวคิด Dictarray ของ TypeScript
วิธีแก้แบบง่ายคือการบอก TypeScript ว่าทุกอย่างเรียบร้อยดีและคุณรู้ว่ากำลังทำอะไรอยู่:
interface ISomeObject {
[index: string]: number[];
// @ts-ignore: I'm creating a Dictarray!
general: {
[index: string]: number;
};
}
คอมไพเลอร์จะระบุประเภทของค่าที่ส่งคืนได้อย่างถูกต้อง ซึ่งในกรณีนี้คือจำนวนตัวเลข:
let x: ISomeObject;
const a = x.general['idx'];
const b = x['idx'];
บทความที่แนบมามีข้อมูลเพิ่มเติม แต่สิ่งนี้คือสาระสำคัญในกรณีของคุณโดยเฉพาะ
