È possibile estendere i tipi in Typescript?


156

Di 'che ho il seguente tipo:

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

Ora voglio estendere questo tipo, cioè

type UserEvent extends Event = {
   UserId: string; 
}

Questo non funziona Come posso fare questo?


3
La typeparola chiave viene utilizzata per definire alias di tipo , non interfacce o classi.
Heretic Monkey il

Risposte:


285

La parola chiave extendspuò essere utilizzata solo per interfacce e classi.

Se si desidera dichiarare un tipo con proprietà aggiuntive, è possibile utilizzare il tipo di intersezione :

type UserEvent = Event & {UserId: string}

AGGIORNAMENTO per TypeScript 2.2, ora è possibile avere un'interfaccia che estende il tipo di oggetto , se il tipo soddisfa alcune restrizioni:

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

interface UserEvent extends Event {
   UserId: string; 
}

Non funziona al contrario - UserEventdeve essere dichiarato come interfaccia, non typese si desidera utilizzare la extendssintassi.

Ed è ancora impossibile da usare extend con tipi arbitrari - ad esempio, non funziona se Eventè un parametro di tipo senza vincoli.


Sto usando TS v3.5.2 e non posso avere un'interfaccia che estenda un tipo. interface A<T> extends B<T> {blar}Un'interfaccia può estendere solo un tipo di oggetto o un'intersezione di tipi di oggetto con membri staticamente noti
WORMSS

@WORMSS in questo interface Identifiable<T> extends T { id: string }modo mi dà l'errore "Un'interfaccia può estendere solo un tipo di oggetto o un'intersezione di tipi di oggetto con membri staticamente conosciuti (2312)"
maninak

22

puoi intersecare i tipi:

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

da qualche parte nel tuo codice ora puoi fare:

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

6

Quello che stai cercando di ottenere è equivalente

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

interface UserEvent extends Event {
   UserId: string; 
}

Il modo in cui hai definito i tipi non consente di specificare l'ereditarietà, tuttavia puoi ottenere qualcosa di simile usando i tipi di intersezione, come sottolineato da Artem .


8
Sì, ma non mi piace la parola interfacequando intendo davvero untype
Kousha il

Abbastanza giusto, quindi la risposta di
Artem

-1

Potrebbe essere sotto l'approccio sarà utile per qualcuno TS con reazione

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

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.