默认情况下,打字稿正确地将类类型推断为所述类的 instance ,而不是类 definition 本身。我最近在重构类工厂方法时遇到了这种区别。
我的问题是,表明参数或类型是类的实例还是类的可调用定义的最佳方法是什么?
以此类为例
class MyClass implements IMyClass {
foo = 'foo';
bar() {
return 'bar';
}
}
现在我有两个函数,第一个callBar
正在等待该类的实例
function callBar(instance: MyClass) {
return instance.bar();
}
第二个classFactory
需要类定义。
function classFactory(MyClassDefinition: MyClass) {
return new MyClassDefinition();
}
问题是第二个函数引发类型错误
(parameter) MyClassDefinition: MyClass
This expression is not constructable.
Type 'MyClass' has no construct signatures.(2351)
我采用的解决方案是使用utility-types
npm包中的Class
类型。定义为...
type Class<T> = new (...args: any[]) => T;
function classFactory(MyClassDefinition: Class<MyClass>) {
return new MyClassDefinition();
}
有没有更清晰,更好或更轻松的方法来进行这种区分?
谢谢!
答案 0 :(得分:2)
您需要将其表示为构造函数类型:
function classFactory(MyClassDefinition: new () => MyClass) {
return new MyClassDefinition();
}