类作为实例vs类定义|打字稿

时间:2019-12-17 16:42:07

标签: typescript typescript-typings factory-pattern factory-method

默认情况下,打字稿正确地将类类型推断为所述类的 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();
}

有没有更清晰,更好或更轻松的方法来进行这种区分?

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要将其表示为构造函数类型:

function classFactory(MyClassDefinition: new () => MyClass) {
  return new MyClassDefinition();
}