可以在Typescript中扩展类型吗?

Kou*_*sha 87 javascript typescript

说我有以下类型:

type Event = {
   name: string;
   dateCreated: string;
   type: string;
}
Run Code Online (Sandbox Code Playgroud)

我现在想扩展这种类型,即

type UserEvent extends Event = {
   UserId: string; 
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.我怎样才能做到这一点?

art*_*tem 162

该关键字extends只能用于接口和类.

如果您只想声明具有其他属性的类型,则可以使用交集类型:

type UserEvent = Event & {UserId: string}
Run Code Online (Sandbox Code Playgroud)

对于TypeScript 2.2的UPDATE,它现在可以有一个扩展类似对象类型的接口:

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

interface UserEvent extends Event {
   UserId: string; 
}
Run Code Online (Sandbox Code Playgroud)

它反过来不起作用 - UserEvent必须声明为接口,而不是a type如果你想使用extends语法.


小智 34

通用扩展类型可以写成如下:

type Extension<T> = T & { someExtensionProperty: string }
Run Code Online (Sandbox Code Playgroud)

  • 我会做这样的事情来使其真正通用:`type Extension&lt;T, E&gt; = T &amp; E;` (4认同)

Kay*_*yes 16

您还可以通过使用 来做到这一点type,但使用 除外interface

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

type UserEvent = {
   UserId: string; 
} & Event
Run Code Online (Sandbox Code Playgroud)


Sta*_*lav 9

您可以相交类型:

type TypeA = {
    nameA: string;
};
type TypeB = {
    nameB: string;
};
export type TypeC = TypeA & TypeB;
Run Code Online (Sandbox Code Playgroud)

您现在可以在代码中的某处执行以下操作:

const some: TypeC = {
    nameB: 'B',
    nameA: 'A',
};
Run Code Online (Sandbox Code Playgroud)

  • 我对此有点困惑,这肯定是 TypeC 的联合体吗?我期望 TypeA 和 TypeB 的交集是 {}?即没有任何共同点? (2认同)

oly*_*dis 7

你想要实现的是等同于

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

interface UserEvent extends Event {
   UserId: string; 
}
Run Code Online (Sandbox Code Playgroud)

你定义类型的方式不允许指定继承,但是你可以使用交集类型实现类似的东西,正如artem指出的那样.

  • 是的,但是当我实际上指的是“类型”时,我不喜欢“接口”一词 (4认同)
  • 很公平,那么 artem 的答案应该适合你:) (3认同)

cld*_*dev 5

你也可以这样做:

export type UserEvent = Event & { UserId: string; };
Run Code Online (Sandbox Code Playgroud)

  • 这个答案提供了[2016年答案](/sf/answers/2896960461/)中尚未存在的内容(最后一次编辑于2019年,所以没有借口重复它)? (3认同)