Можно расширить типы в Typescript?
Скажем, у меня есть следующий тип:
type Event = {
name: string;
dateCreated: string;
type: string;
}
Теперь я хочу расширить этот тип, т.е.
type UserEvent extends Event = {
UserId: string;
}
Это не работает. Как я могу это сделать?
Ответы
Ответ 1
Ключевое слово extends
может использоваться только для интерфейсов и классов.
Если вы просто хотите объявить тип, который имеет дополнительные свойства, вы можете использовать тип пересечения:
type UserEvent = Event & {UserId: string}
ОБНОВЛЕНИЕ для TypeScript 2.2, теперь возможно иметь интерфейс, расширяющий объектоподобный тип, если тип удовлетворяет некоторым ограничениям:
type Event = {
name: string;
dateCreated: string;
type: string;
}
interface UserEvent extends Event {
UserId: string;
}
Это не работает наоборот - UserEvent
должен быть объявлен как интерфейс, а не type
если вы хотите использовать, extends
синтаксис.
И все еще невозможно использовать extend
с произвольными типами - например, оно не работает, если Event
является параметром типа без каких-либо ограничений.
Ответ 2
То, что вы пытаетесь достичь, эквивалентно
interface Event {
name: string;
dateCreated: string;
type: string;
}
interface UserEvent extends Event {
UserId: string;
}
То, как вы определили типы, не позволяет указывать наследование, однако вы можете добиться чего-то подобного с помощью типов пересечений, как указано artem.
Ответ 3
Вы можете пересекать типы:
type TypeA = {
nameA: string;
};
type TypeB = {
nameB: string;
};
export type TypeC = TypeA & TypeB;
где-то в вашем коде теперь вы можете сделать:
const some: TypeC = {
nameB: 'B',
nameA: 'A',
};
Ответ 4
type UserEvent = Event | AnotherType