Можно расширить типы в 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