我遇到了一个有趣的问题。我有一个带有静态方法的抽象类,我希望扩展多个其他类。
我想将所有这些未实例化的类作为数组提供给另一个类中的方法。如果从类静态方法返回的值为 false,则此其他类方法将实例化它们。
以下是一些示例代码来说明我的问题:
abstract class Abstract {
public static defer() {
return true;
}
}
class MyClass extends Abstract {}
class OtherClass {
public add(my_classes: Array<new () => Abstract>) {
const x = my_classes[0].defer();
const y = new my_classes[0]();
}
}
const other_class = new OtherClass();
other_class.add([MyClass]);
在const x = my_classes[0].defer();
行上,我收到以下错误:
属性 'defer' 在类型'new (( => Abstract'.ts(2339( 上不存在
如果我将my_classes参数切换为具有Array<typeof Abstract>
类型,则在尝试实例化它时会出现以下错误:
无法创建抽象类的实例(2511(
在这种情况下,如何调用静态方法并能够创建类的新实例?
类型new () => Abstract
只表示一个函数,它可以充当Abstract
类的构造函数。它不会捕获Abstract
的静态成员,因为理论上您可以创建其他遵循new () => Abstract
但不包含任何静态成员的类。
在打字稿中,您可以使用typeof Abstract
访问静态成员。因此,更改add
方法的定义以包括构造函数签名和静态方法:
public add(my_classes: Array<typeof Abstract & (new () => Abstract)>) { ... }
这应该纠正你的错误。
请注意,在 Typescript 中,类的实例类型与类名相同。在您的示例中,Abstract
类的实例将具有类型Abstract
。您可以通过以typeof
为前缀来访问类的静态端。
游乐场链接。