gpt4 book ai didi

typescript 泛型 : Refer to class instead of instance

转载 作者:搜寻专家 更新时间:2023-10-30 21:11:23 24 4
gpt4 key购买 nike

我遇到了一种情况,我想在一组接口(interface)中使用通用类型。我的公共(public)接口(interface)接收通用类型并将其传递给非导出的私有(private)接口(interface)。在我的公共(public)接口(interface)中,我想使用通用类型 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 = CarModelT['constructor'] 作为 blueprint 类型有效,但前提是我像这样修补我的类:

class CarModel {
public ['constructor']: typeof CarModel;
}

所以问题是:我怎样才能像这样使用泛型?同时使用 T 和实际的 T 实例?生成器函数或带有修补程序 T['constructor'] 是我唯一的选择吗?我是否需要传递另一个泛型类型 U,它类似于 U = typeof T

最佳答案

你的意思是这样的吗?

给定一个类Cartype of the class itself(引用类构造函数的符号Car)将是typeof Car。在 CarFactory 接口(interface)中,我们没有一些具体的类,所以我们可以使用 type of the constructor function new (...args: any) => T for blueprint:

export interface CarFactory<T> {
cars: Car<T>[];
// use a constructor function type here
blueprint: new (...args: any) => T;
}

测试它:

class CombiUnit {
// your implementation of a car unit/model T goes here
}

type CombiUnitFactory = CarFactory<CombiUnit>;

// new (...args: any) => CombiUnit
type CombiUnitFactoryCtorFunction = CombiUnitFactory["blueprint"];

// some concrete factory
declare const t1: CombiUnitFactory;

const result = new t1.blueprint(); // const result: CombiUnit

Playground

关于 typescript 泛型 : Refer to class instead of instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58075659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com