ChatGPT解决这个技术问题 Extra ChatGPT

可以在 Typescript 中扩展类型吗?

假设我有以下类型:

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

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

type UserEvent extends Event = {
   UserId: string; 
}

这行不通。我怎样才能做到这一点?

type 关键字用于定义 type aliases,而不是接口或类。

A
AndreM96

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

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

type UserEvent = Event & {UserId: string}

UPDATE 用于 TypeScript 2.2,it's now possible to have an interface that extends object-like type,如果类型满足某些限制:

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

interface UserEvent extends Event {
   UserId: string; 
}

相反,它不起作用 - 如果您想使用 extends 语法,必须将 UserEvent 声明为接口,而不是 type

而且仍然无法使用 extend with arbitrary types - 例如,如果 Event 是没有任何约束的类型参数,它就不起作用。


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

你可以相交类型:

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

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

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

这是一个很好的解决方案。我在 React Native 中工作,这使我可以轻松地为自己的自定义文本输入组件扩展 TextInputProps。谢谢!
C
Community

您要达到的目标相当于

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

interface UserEvent extends Event {
   UserId: string; 
}

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


是的,但我不喜欢 interface 这个词,因为我实际上是指 type
很公平,那么artem的答案应该适合你:)
a
aegatlin

泛型扩展类型可以写成如下:

type Extension<T> = T & { someExtensionProperty: string }