การรวมวัตถุภายในอินเตอร์เฟซในไทป์สคริปต์
ฉันมีสิ่งต่อไปนี้ในไฟล์พิมพ์:
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
นั่นช่วยได้ไหม?
