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

Ale*_*lls 9 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
Run Code Online (Sandbox Code Playgroud)

问题是这SomeSuperClass意味着Clazz将是 的一个实例SomeSuperClass,而不是SomeSuperClass它本身。

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

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

      const v = new Clazz();

   }
Run Code Online (Sandbox Code Playgroud)

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

Ale*_* L. 7

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

const foo = function(ctor: new() => SomeSuperClass) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

const foo = function(ctor: typeof SomeSuperClass) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*lls 5

看了这个答案后,看起来唯一的方法是这样:

interface ISomeSuperClass {
    new (): SomeSuperClass;
}
Run Code Online (Sandbox Code Playgroud)

然后 foo 会变成:

   const foo = function(Clazz: ISomeSuperClass){

      const v = new Clazz();

   }
Run Code Online (Sandbox Code Playgroud)

这看起来有点奇怪,但它可以编译。