例如,我想创建一个如下所示的类型.

class C1 {}

type TGenericType<T> = typeof T;

let test: TGeneticType<C1>; //=> typeof C1

我不想显式地将typeof作为泛型传递,如下所示

let test: TGeneticType<typeof C1>

推荐答案

没有办法将TypeScript typeof operator重新实现或包装为generic类型.

类型脚本typeof运算符将变量或属性之类的value作为参数,并计算为该值的类型.如果您编写typeof C1,则C1将被解释为名为C1的值,它是C1类的构造函数.

但是泛型类型参数,如TGenericType<T> type alias中的T,表示types而不是值.因此,typeof T没有意义,因为T本身就是一种类型.因此出现编译器错误:

type TGenericType<T> = typeof T; // error!
// -------------------------> ~
// 'T' only refers to a type, but is being used as a value here.

如果你想解决这个问题,你要么会发现自己在写

type TGenericType<T> = T;
let test: TGenericType<typeof C1> = C1;

这并不比从typeof C1开始好;或者,你会决定你真正想要的是TGenericType<C1>产生一个constructor type,其中C1是实例,看起来像这样:

type TGenericType<T> = new () => T;
let test: TGenericType<C1> = C1; // okay

但这实际上与C1值没有任何关系,因此,虽然您可以使用它来构造新的C1个实例,但您可能会忘记任何静态属性:

class C1 { 
    static foo = 1;
    bar = 2;
}
new C1().bar; // okay
new test().bar; // okay
C1.foo; // okay
test.foo // error

这取决于您的用例,您想要使用其中的哪一个,或者您是否想要完全放弃.

Playground link to code

Typescript相关问答推荐

TS 2339:属性切片不存在于类型DeliverableSignal产品[]上>'

如何推断类方法未知返回类型并在属性中使用它

需要使用相同组件重新加载路由变更数据—React TSX

JS Redux Devtools扩展不工作

无法正确推断嵌套泛型?

为什么我的查询钩子返回的结果与浏览器的网络选项卡中看到的结果不同?

如何在使用条件类型时使用void

如何正确调用创建的类型?

自定义 Select 组件的类型问题:使用带逗号的泛型类型<;T与不带逗号的<;T&>;时出错

在组件卸载时try 使用useEffect清除状态时发生冲突.react +打字

ANGLE NumberValueAccessor表单控件值更改订阅两次

17个Angular 的延迟观察.如何在模板中转义@符号?

将超类型断言为类型脚本中的泛型参数

我不明白使用打字脚本在模板中展开参考

打印脚本中正则函数和函数表达式的不同类型缩小行为

在打字应用程序中使用Zod和Reaction-Hook-Forms时显示中断打字时出错

如何在Deno中获取Base64图像的宽/高?

两个名称不同的相同打字界面-如何使其干燥/避免重复?

为什么 Typescript 无法正确推断数组元素的类型?

如何将参数传递给条件函数类型