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

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'];

บทความที่แนบมามีข้อมูลเพิ่มเติม แต่สิ่งนี้คือสาระสำคัญในกรณีของคุณโดยเฉพาะ

บทความที่เกี่ยวข้อง