web-dev-qa-db-fra.com

Possible d'étendre des types en dactylographie?

Dites que j'ai le type suivant:

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

Je souhaite maintenant étendre ce type, c.-à-d.

type UserEvent extends Event = {
   UserId: string; 
}

Ça ne marche pas. Comment puis-je faire ceci?

74
Kousha

Le mot clé extends ne peut être utilisé que pour les interfaces et les classes.

Si vous souhaitez simplement déclarer un type ayant des propriétés supplémentaires, vous pouvez utiliser type d'intersection :

type UserEvent = Event & {UserId: string}

UPDATE pour TypeScript 2.2, il est maintenant possible d'avoir une interface qui étend le type objet , si le type satisfait quelques restrictions:

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

interface UserEvent extends Event {
   UserId: string; 
}

Cela ne fonctionne pas dans l'autre sens - UserEvent doit être déclaré en tant qu'interface et non en tant que type si vous souhaitez utiliser la syntaxe extends.

Et il est toujours impossible d'utiliser extendavec des types arbitraires - par exemple, cela ne fonctionne pas si Event est un paramètre de type sans aucune contrainte.

136
artem

vous pouvez intersecter des types:

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

quelque part dans votre code, vous pouvez maintenant faire:

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

Ce que vous essayez d’atteindre équivaut à

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

interface UserEvent extends Event {
   UserId: string; 
}

La manière dont vous avez défini les types ne permet pas de spécifier l'héritage. Toutefois, vous pouvez obtenir quelque chose de similaire en utilisant des types d'intersection, comme indiqué par artem .

6
olydis