Можливо розширення типів у Typescript?


156

Скажіть, у мене такий тип:

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

Зараз я хочу поширити цей тип, тобто

type UserEvent extends Event = {
   UserId: string; 
}

Це не працює. Як я можу це зробити?


3
typeКлючове слово використовується для визначення псевдонімів типів , а НЕ інтерфейсів або класів.
Єретична мавпа

Відповіді:


285

Ключове слово extendsможна використовувати лише для інтерфейсів та класів.

Якщо ви просто хочете оголосити тип, який має додаткові властивості, ви можете використовувати тип перетину :

type UserEvent = Event & {UserId: string}

UPDATE для TypeScript 2.2, тепер можна мати інтерфейс, який розширює об’єктоподібний тип , якщо тип задовольняє деяким обмеженням:

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

interface UserEvent extends Event {
   UserId: string; 
}

Це не працює навпаки - його UserEventпотрібно оголосити як інтерфейс, а не, typeякщо ви хочете використовувати extendsсинтаксис.

І це все ще неможливо використовувати extend з довільними типами - наприклад, він не працює, якщо Eventє параметром типу без будь-яких обмежень.


Я використовую TS v3.5.2, і я не в змозі мати тип розширення інтерфейсу. interface A<T> extends B<T> {blar}Інтерфейс може розширювати лише тип об'єкта або перетин типів об'єктів зі статично відомими членами
WORMSS

@WORMSS, роблячи це, interface Identifiable<T> extends T { id: string }дає мені помилку "Інтерфейс може розширювати лише тип об'єкта або перетин типів об'єктів зі статично відомими members.ts (2312)"
maninak

22

Ви можете перетинати типи:

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

десь у вашому коді ви тепер можете зробити:

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

6

Те, що ви намагаєтесь досягти, рівнозначне

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

interface UserEvent extends Event {
   UserId: string; 
}

Те, як ви визначили типи, не дозволяє вказати спадкування, однак ви можете домогтися чогось подібного, використовуючи типи перетину, як вказував Артем .


8
Так, але мені не подобається слово, interfaceколи я насправді маю на увазіtype
Куша

Досить справедливо, тоді відповідь
Артема

-1

Можливо, нижче підхід буде корисним для когось із ТС з reactjs

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

interface UserEvent<T> extends Event<T> {
    UserId: string;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.