抽象类中的静态工厂方法

jus*_*ris 6 oop typescript

我正在用 Typescript 构建一个类系统。有一个主要的抽象类Component,它有一个静态方法create()。将调用此方法来构建特定实例

abstract class Component {
    static build() {
       // some additional logic here, for example, cache to reuse instances
       return new this();
    }
}

class Button extends Component { }
class Input extends Component {}

Button.build(); // returns Button instance
Input.build(); // returns Input instance
Run Code Online (Sandbox Code Playgroud)

TS Playground 中的相同代码

这种方法在 Javascript 中运行良好,但是 Typescript 在 行报告错误new this(),说“无法创建抽象类的实例”。

我如何解释打字稿该方法将在派生实例上调用,而不是直接在主抽象类上调用?也许还有其他方法可以实现我需要的 API?

Est*_*ask 5

thisis typeof Component,并且因为Component是抽象类,new this是不可接受的。即使Component不是抽象的,Button.build()返回类型也不会在子类中正确处理。

它需要一些类型提示,通过泛型方法

abstract class Component {
    static build<T = Component>(this: { new(): T }) {
       return new this();
    }
}

class Button extends Component { }

const button = Button.build<Button>(); // button: Button
Run Code Online (Sandbox Code Playgroud)

  • 您只需要从调用中删除显式参数,而不是定义。工作示例:https://www.typescriptlang.org/play/index.html#src=abstract%20class%20Component%20%7B%0D%0A%09static%20build%3CT%20%3D%20Component%3E(this %3A%20%7B%20new()%3A%20T%20%7D)%20%7B%0D%0A%09%20%20%20return%20new%20this()%3B%0D%0A%09% 7D%0D%0A%7D%0D%0A%0D%0Aclass%20Button%20extends%20Component%20%7B%0D%0A%09test%3A%20number%20%3D%200%3B%0D%0A%7D% 0D%0A%0D%0Aconst%20button%20%3D%20Button.build()%3B%0D%0Aconsole.log(button.test)%3B%0D%0A (2认同)