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

การรวมวัตถุภายในอินเตอร์เฟซในไทป์สคริปต์


ฉันมีสิ่งต่อไปนี้ในไฟล์พิมพ์:

interface A {
    anObject: {
        data: string;
    };
    someOtherData: boolean;
}

ตอนนี้ฉันต้องการเปลี่ยนอินเทอร์เฟซเพื่อให้ anObject รวมถึง data2 ด้วย ฉันต้องการให้รูปแบบสุดท้ายเป็น

interface A {
    anObject: {
        data: string;
        data2: string;
    };
    someOtherData: boolean;
}

ฉันได้ลองทำสิ่งนี้แล้วและมันล้มเหลว:

interface A {
    anObject: {
        data2: string;
    }
}

แทนที่ anObject จะมีทั้ง data และ data2 มันมีเพียง data2 เท่านั้น มีวิธีใดที่จะเก็บคีย์เดิมไว้ได้ไหม?

คำตอบ #1

อืม แล้วแบบนี้ล่ะ:

orig.ts

export interface A {
    anObject: {
        data: string;
    };
    someOtherData: boolean;
}

extend.ts

import {A as _A} from './orig'

interface A extends _A {
  anObject: _A['anObject'] & {
    data2: string;
  }
}

นั่นคือ: เปลี่ยนชื่อ A เดิมให้ออกไปเป็น _A ระหว่างการนำเข้า จากนั้นขยายมันและรวมคุณสมบัติ data2 ใหม่เข้ากับของเดิมโดยการหาตัดกันกับคุณสมบัติ anObject ที่ถูกค้นหา

หรือถ้าคุณไม่รังเกียจที่ A จะเป็นนามแฝงของ type ไม่ใช่ interface ก็มีวิธีที่ง่ายกว่า:

extend.ts

import {A as _A} from './playground'

type A = _A & {
  anObject: {
    data2: string;
  }
}

...ซึ่งคุณยังคงเปลี่ยนชื่อของต้นฉบับออกไปจากทาง แต่จากนั้นก็เพียงแค่ทำการตัดกันกับส่วนใหม่ วิธีใดวิธีหนึ่งก็จะให้ประเภทที่คุณต้องการ:

declare const a: A;
a.anObject.data.charAt(0); // okay
a.anObject.data2.charAt(0); // okay

นั่นช่วยได้ไหม?

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