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?

Kousha
sumber
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.

Artem
sumber
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',
};
Stanislav
sumber
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 .

olydi
sumber
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;
}
Jaison
sumber