Pesquisa de site

javascript - É possível estender tipos no Typescript?


Diga que eu tenho o seguinte tipo:

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

Agora eu quero estender este tipo, ou seja

type UserEvent extends Event = {
   UserId: string; 
}

Isso não funciona. Como eu posso fazer isso?

Resposta #1

A palavra-chave extends pode ser usada apenas para interfaces e classes.

Se você apenas quer declarar um tipo que tenha propriedades adicionais, você pode usar tipo de interseção:

type UserEvent = Event & {UserId: string}

ATUALIZAÇÃO para TypeScript 2.2, agora é possível ter uma interface que estende um tipo parecido com objeto, se o tipo satisfizer algumas restrições:

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

interface UserEvent extends Event {
   UserId: string; 
}

Não funciona ao contrário - UserEvent deve ser declarado como interface, não um type se você quiser usar a sintaxe extends.

E ainda é impossível usar extend com tipos arbitrários - por exemplo, não funciona se Event for um parâmetro de tipo sem quaisquer restrições.

Resposta #2

você pode intersectar tipos:

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

em algum lugar no seu código você agora pode fazer:

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

Resposta #3

Um tipo de extensão genérica pode ser escrito da seguinte forma:

type Extension<T> = T & { someExtensionProperty: string }

Resposta #4

Você também pode fazer isso utilizando type além de interface:

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

type UserEvent = {
   UserId: string; 
} & Event

Resposta #5

O que você está tentando alcançar é equivalente a

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

interface UserEvent extends Event {
   UserId: string; 
}

A maneira como você definiu os tipos não permite especificar herança, no entanto, você pode alcançar algo semelhante usando tipos de interseção, como artem apontou.

Artigos relacionados