สามารถขยายประเภทใน typescript ได้หรือไม่?


193

สมมติว่าฉันมีประเภทต่อไปนี้:

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

ตอนนี้ฉันต้องการขยายประเภทนี้เช่น

type UserEvent extends Event = {
   UserId: string; 
}

วิธีนี้ใช้ไม่ได้ ฉันจะทำเช่นนี้ได้อย่างไร?


3
typeคำหลักที่จะใช้ในการกำหนดชื่อแทนประเภทไม่อินเตอร์เฟซหรือชั้นเรียน
ลิงนอกรีต

คำตอบ:


352

คีย์เวิร์ดextendsสามารถใช้สำหรับอินเทอร์เฟซและคลาสเท่านั้น

หากคุณต้องการประกาศประเภทที่มีคุณสมบัติเพิ่มเติมคุณสามารถใช้ประเภทจุดตัด :

type UserEvent = Event & {UserId: string}

อัปเดตสำหรับ TypeScript 2.2 ตอนนี้เป็นไปได้ที่จะมีอินเทอร์เฟซที่ขยายประเภทวัตถุเหมือนหากประเภทตรงตามข้อ จำกัด บางประการ:

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent extends Event {
   UserId: string; 
}

มันไม่ได้ผลในทางอื่น - UserEventต้องประกาศเป็นอินเทอร์เฟซไม่ใช่typeถ้าคุณต้องการใช้extendsไวยากรณ์

และยังคงเป็นไปไม่ได้ที่จะใช้extend กับประเภทที่กำหนดเองตัวอย่างเช่นไม่สามารถใช้งานได้หากEventเป็นพารามิเตอร์ type โดยไม่มีข้อ จำกัด ใด ๆ


ฉันใช้ TS v3.5.2 และฉันไม่สามารถมีส่วนต่อประสานที่ขยายประเภทได้ interface A<T> extends B<T> {blar}อินเทอร์เฟซสามารถขยายประเภทออบเจ็กต์หรือจุดตัดของประเภทออบเจ็กต์ได้เฉพาะกับสมาชิกที่รู้จักแบบคงที่
WORMSS

@WORMSS การทำเช่นนี้interface Identifiable<T> extends T { id: string }ทำให้ฉันมีข้อผิดพลาด "อินเทอร์เฟซสามารถขยายประเภทอ็อบเจ็กต์หรือจุดตัดของประเภทอ็อบเจ็กต์ได้เฉพาะกับ
Members.ts

27

คุณสามารถตัดกันประเภท:

type TypeA = {
    nameA: string;
};
type TypeB = {
    nameB: string;
};
export type TypeC = TypeA & TypeB;

ตอนนี้คุณสามารถทำโค้ดที่ไหนสักแห่ง:

const some: TypeC = {
    nameB: 'B',
    nameA: 'A',
};

นี่เป็นทางออกที่ยอดเยี่ยม ฉันกำลังทำงานใน React Native และสิ่งนี้ทำให้ฉันสามารถขยายTextInputPropsองค์ประกอบการป้อนข้อความที่กำหนดเองได้อย่างง่ายดาย ขอบคุณ!
Nick Tiberi

7

สิ่งที่คุณพยายามจะบรรลุนั้นเทียบเท่ากับ

interface Event {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent extends Event {
   UserId: string; 
}

วิธีที่คุณกำหนดชนิดไม่อนุญาตให้มีการระบุมรดก, แต่คุณสามารถบรรลุสิ่งที่คล้ายกันโดยใช้ประเภทแยกเป็นArtemชี้ให้เห็น


13
ใช่ แต่ฉันไม่ชอบคำที่interfaceเมื่อฉันหมายถึงtype
Kousha

พอใช้แล้วคำตอบของอาร์เทมน่าจะเหมาะกับคุณ :)
olydis

-1

อาจเป็นแนวทางด้านล่างจะเป็นประโยชน์สำหรับคนที่ TS ด้วย reactjs

interface Event {
   name: string;
   dateCreated: string;
   type: string;
}

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.