Dimungkinkan untuk memperluas jenis dalam naskah?


156

Katakanlah saya memiliki tipe berikut:

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

Saya sekarang ingin memperluas jenis ini, yaitu

type UserEvent extends Event = {
   UserId: string; 
}

Ini tidak berhasil. Bagaimana saya bisa melakukan ini?


3
Kata typekunci digunakan untuk mendefinisikan alias tipe , bukan antarmuka atau kelas.
Monyet

Jawaban:


285

Kata kunci hanya extendsdapat digunakan untuk antarmuka dan kelas.

Jika Anda hanya ingin mendeklarasikan tipe yang memiliki properti tambahan, Anda bisa menggunakan tipe persimpangan :

type UserEvent = Event & {UserId: string}

UPDATE untuk TypeScript 2.2, sekarang mungkin untuk memiliki antarmuka yang memperluas tipe seperti objek , jika jenisnya memenuhi beberapa batasan:

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

interface UserEvent extends Event {
   UserId: string; 
}

Tidak bekerja sebaliknya - UserEventharus dinyatakan sebagai antarmuka, bukan typejika Anda ingin menggunakan extendssintaks.

Dan masih tidak mungkin untuk digunakan extend dengan tipe arbitrer - misalnya, itu tidak berfungsi jika Eventmerupakan parameter tipe tanpa kendala.


Saya menggunakan TS v3.5.2, dan saya tidak dapat memiliki antarmuka memperpanjang tipe. interface A<T> extends B<T> {blar}Antarmuka hanya dapat memperluas jenis objek atau persimpangan jenis objek dengan anggota yang dikenal secara statis
WORMSS

@WORMSS melakukan ini interface Identifiable<T> extends T { id: string }memberi saya kesalahan "Antarmuka hanya dapat memperluas jenis objek atau persimpangan jenis objek dengan anggota yang dikenal secara statis.ts (2312)"
maninak

22

Anda dapat memotong jenis:

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

suatu tempat dalam kode Anda sekarang dapat Anda lakukan:

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

6

Apa yang ingin Anda capai setara dengan

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

interface UserEvent extends Event {
   UserId: string; 
}

Cara Anda mendefinisikan jenis tidak memungkinkan untuk menentukan pewarisan, namun Anda dapat mencapai sesuatu yang serupa menggunakan tipe persimpangan, seperti yang ditunjukkan artem .


8
Ya, tapi saya tidak suka kata interfaceketika saya benar-benar berartitype
Kousha

Cukup adil, maka jawaban artem cocok untuk Anda :)
olydis

-1

Mungkin pendekatan di bawah ini akan bermanfaat bagi seseorang yang TS dengan reaksi

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

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.