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.
