使用 TypeScript 声明 class 类型(将 class 作为参数传递)
Declare class type with TypeScript (pass class as parameter)
所以我有一个接受不同构造函数的函数,像这样:
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();
}
执行此操作的正确方法是什么?
看了this answer之后,看来只有这样才能做到:
interface ISomeSuperClass {
new (): SomeSuperClass;
}
foo 将变为:
const foo = function(Clazz: ISomeSuperClass){
const v = new Clazz();
}
这看起来有点奇怪,但它可以编译。
正如您所提到的,您正在寻找的是如何描述 class 构造函数而不是实例。可以通过以下方式实现:
const foo = function(ctor: new() => SomeSuperClass) {
...
}
或者(在本例中结果相同):
const foo = function(ctor: typeof SomeSuperClass) {
...
}
这还要求 A
和 B
具有无参数构造函数
以下方法对我有用。
变量名:类名类型;
其中,typeof 是 Javascript 关键字。
所以我有一个接受不同构造函数的函数,像这样:
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();
}
执行此操作的正确方法是什么?
看了this answer之后,看来只有这样才能做到:
interface ISomeSuperClass {
new (): SomeSuperClass;
}
foo 将变为:
const foo = function(Clazz: ISomeSuperClass){
const v = new Clazz();
}
这看起来有点奇怪,但它可以编译。
正如您所提到的,您正在寻找的是如何描述 class 构造函数而不是实例。可以通过以下方式实现:
const foo = function(ctor: new() => SomeSuperClass) {
...
}
或者(在本例中结果相同):
const foo = function(ctor: typeof SomeSuperClass) {
...
}
这还要求 A
和 B
具有无参数构造函数
以下方法对我有用。
变量名:类名类型;
其中,typeof 是 Javascript 关键字。