使用TypeScript声明类类型(将类作为参数传递)

时间:2017-11-25 08:30:02

标签: typescript typescript2.0

所以我有一个接受不同构造函数的函数,如下所示:

export class SomeSuperClass {
 ...
}

export class A extends SomeSuperClass {
 ...
}

export class B extends SomeSuperClass {
 ...
}


const foo = function(Clazz: SomeSuperClass){

  const v = new Clazz();

}

foo(A);  // pass the class itself
foo(B);  // pass the class itself

问题是SomeSuperClass表示Clazz将是SomeSuperClass的实例,而不是SomeSuperClass本身。

我尝试过这样的蠢事(显然不起作用):

   const foo = function(Clazz: SomeSuperClass.constructor){

      const v = new Clazz();

   }

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

在查看this answer之后,看起来这样做的唯一方法是:

interface ISomeSuperClass {
    new (): SomeSuperClass;
}

然后foo将成为:

   const foo = function(Clazz: ISomeSuperClass){

      const v = new Clazz();

   }

这看起来很奇怪,但它会编译。

答案 1 :(得分:1)

正如您所提到的,您所关注的是如何描述类构造函数而不是实例。它可以通过以下方式实现:

const foo = function(ctor: new() => SomeSuperClass) {
    ...
}

或者(在这种情况下结果相同):

const foo = function(ctor: typeof SomeSuperClass) {
    ...
}

这也需要AB拥有无参数构造函数

答案 2 :(得分:0)

以下方法对我有用。

VarName:typeof ClassName;

其中typeof是Javascript关键字。