首页 > 解决方案 > 类作为实例与类定义 | 打字稿

问题描述

默认情况下,打字稿正确地将类类型推断为所述类的实例,而不是类定义本身。我最近在重构类工厂方法时遇到了这种区别。

我的问题是表明参数或类型是类的实例或类的可调用定义的最佳方式是什么?

以这个类为例

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)

我采用的解决方案是使用npm 包中的Class类型。utility-types这被定义为...

type Class<T> = new (...args: any[]) => T;

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

有没有更清晰、更好或更简单的方法来区分?

谢谢!

标签: typescripttypescript-typingsfactory-patternfactory-method

解决方案


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

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

推荐阅读