【发布时间】:2021-05-08 16:22:11
【问题描述】:
我想使用typeof 运算符从类中获取构造函数类型,但是当您想在类字典中使用它时它似乎不起作用。例如。 typeof Modules[T] - 编译器没有得到 Modules[T] 的类型,而是考虑 (typeof Modules)[T]
class A { }
class B { }
abstract class Modules {
public a!: A;
public b!: B;
}
// Error: Type 'T' cannot be used to index type 'typeof Modules'
function addModule<T extends keyof Modules>(key: T, ModuleCtor: typeof Modules[T]) {
let module = new ModuleCtor();
}
addModule('a', A);
// Works but the constructor arguments type is lost
function addModule2<T extends keyof Modules>(
key: T,
ModuleCtor: new (...args:any[]) => Modules[T]
) {
let module = new ModuleCtor();
}
addModule2('a', A);
更新
正如 Aleksey 所指出的,typeof 运算符仅适用于值。类是实际值,但我这里有的是纯类型。我本质上是在寻找像 typeof Class (value) 这样工作的东西,它可以获得纯类类型的构造函数的确切类型(包括它的参数)。
【问题讨论】:
-
你不能将
typeof与类型一起使用,它应该与值一起使用。这就是为什么第一次尝试不起作用 -
typeof可用于获取类构造函数的类型。 typescriptlang.org/play?#code/… -
当然,如果你将它与作为值的类/函数一起使用。
Modules[T]是一个类型 -
啊哈。现在明白了,谢谢!我现在也明白,我之前的
new (...args:any[]) => Modules[T]解决方案已经足够好了,因为返回相同事物的类很难拥有不同的构造函数参数。虽然我仍然想知道是否有一个类类型的“typeof”等价物可以得到构造函数的确切类型,包括参数。
标签: javascript typescript typescript-typings