【发布时间】:2019-09-24 08:00:38
【问题描述】:
我有一种情况,我想在一组接口中使用泛型类型。我的公共接口接收泛型类型并将其传递给非导出的私有接口。在我的公共接口中,我想使用泛型类型T,但我不希望它引用T 的实例。我想说它是T,这个类可以产生T 的实例。
尝试这个,我得到一个错误:
interface Car<T> {
unit: T;
progress: number;
}
export interface CarFactory<T> {
cars: Car<T>[];
// Type error: 'T' only refers to a type, but is being used as a value here. TS2693
blueprint: typeof T;
}
使用生成器函数有效。但随后我必须将其传递下去并暴露更多我想要避免的代码内部结构。
interface CarFactory<T> {
blueprint: (args: any) => T;
}
我不能直接使用T,因为这会导致编译器认为它应该接收T 的实例,而不是类。这会触发 TS2740 错误。使用 T = CarModel 和 T['constructor'] 作为 blueprint 类型有效,但前提是我像这样修补我的类:
class CarModel {
public ['constructor']: typeof CarModel;
}
所以问题是:我怎样才能使用这样的泛型?使用T 和实际T 的两个实例?生成器函数或带有修补的T 的['constructor'] 是我唯一的选择吗?我是否需要传递另一个泛型类型U,类似于U = typeof T?
【问题讨论】:
-
T应该在Car<T>中是什么?这是某种仅适用于给定类型的汽车,但我不确定这是否是您的意思。也许您甚至不需要 Car 的泛型。对我来说,interface Car没有泛型,然后是interface CarFactory<T extends Car>之类的东西似乎更合乎逻辑,因为 CarFactory 将创建汽车。 -
实例类型和类类型之间没有直接联系,如果这是你所追求的。有一个建议自动键入
constructor,就像您在CarModel中一样,但它尚未实现 -
我意识到我在将代码转换为此处的示例时感到困惑。修正了我的问题,使其更加重要。抱歉不清楚!
标签: typescript generics