方法的打字稿声明参数是抽象类的类型和执行静态方法



我遇到了一个有趣的问题。我有一个带有静态方法的抽象类,我希望扩展多个其他类。

我想将所有这些未实例化的类作为数组提供给另一个类中的方法。如果从类静态方法返回的值为 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为前缀来访问类的静态端。


游乐场链接。

最新更新