可以在 Typescript 中扩展类型吗?

IT技术 javascript typescript
2021-03-01 23:24:24

假设我有以下类型:

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

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

type UserEvent extends Event = {
   UserId: string; 
}

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

4个回答

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

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

type UserEvent = Event & {UserId: string}

TypeScript 2.2 的更新,如果类型满足一些限制,现在可以有一个扩展类对象 type 的接口

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

interface UserEvent extends Event {
   UserId: string; 
}

它不能反过来工作 -UserEvent必须声明为接口,而不是 atype如果你想使用extends语法。

并且仍然无法extend 与任意类型一起使用- 例如,如果Event是没有任何约束的类型参数,则它不起作用

由于 typeScript 是结构类型的,与名义上相比,扩展没有进一步结构(约束)的“任意类型”可能总是不可能的。
2021-04-17 23:24:24
我使用的是 TS v3.5.2,我无法让接口扩展类型。 interface A<T> extends B<T> {blar}接口只能扩展对象类型或对象类型与静态已知成员的交集
2021-05-03 23:24:24
@WORMSS 这样做interface Identifiable<T> extends T { id: string }给我错误“接口只能扩展对象类型或对象类型与静态已知成员的交集.ts(2312)”
2021-05-04 23:24:24

你可以交叉类型:

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

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

const some: TypeC = {
    nameB: 'B',
    nameA: 'A',
};
太好了,这很管用。感谢您的解决方案。
2021-05-09 23:24:24
这是一个很好的解决方案。我在 React Native 工作,这让我可以轻松扩展TextInputProps我自己的自定义文本输入组件。谢谢!
2021-05-12 23:24:24

您想要实现的目标相当于

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

interface UserEvent extends Event {
   UserId: string; 
}

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

足够公平,那么 artem 的答案应该适合您:)
2021-05-03 23:24:24
是的,但我不喜欢这个词,interface因为我实际上是指type
2021-05-12 23:24:24

你也可以这样做:

export type UserEvent = Event & { UserId: string; };
这个答案提供了什么,而2016 年的答案中还没有(最后一次编辑是在 2019 年,所以没有理由复制它)?
2021-04-28 23:24:24