Typescript - 从抽象构造函数调用抽象方法或提供等效功能

标签 typescript constructor abstract-class abstract

在 Typescript 中 - 无法从抽象构造函数中调用抽象方法(代码将编译,但会在运行时崩溃)。

以下例代码崩溃为例:

abstract class Puzzle {


    addState = () => {
         let data = this.createStateData()
         //Perform a operation with data 
    }

    abstract createStateData: () => Object

    protected constructor() {
        //The code crashes here because createStateData
        //has not been defined yet
        this.addState()
     }

}

class RiverPuzzle extends Puzzle {

    createStateData = (): Object => {
         return 'Foo'
    }

    constructor() { 
        super()
        //this.addState()
    }

}

在此特定示例中,可以通过取消注释 RiverPuzzle 类的构造函数中的行并注释抽象类的构造函数中的有问题的行来解决该问题。

但是,该解决方案并不是最优的,因为有许多类扩展了抽象类 Puzzle 并且我不想手动将 this.addState() 添加到构造函数每个子类。

什么是更有效的替代方案?

最佳答案

您正在使用arrow functions as methods ,这通常是不鼓励的。它用 this 做了奇怪的事情,并且类的每个实例都有自己的方法,而不是原型(prototype)上只有一个方法。除非你有充分的理由,否则我建议你使用原型(prototype)方法(不使用箭头函数表示法),如下所示:

abstract class Puzzle {
    addState() {
         let data = this.createStateData()
         //Perform a operation with data 
    }

    abstract createStateData(): Object

    protected constructor() {
        this.addState()
     }
}

class RiverPuzzle extends Puzzle {
    createStateData() {
         return 'Foo'
    }

    constructor() { 
        super()            
    }
}

这应该会像你期望的那样发挥作用。

关于Typescript - 从抽象构造函数调用抽象方法或提供等效功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51864697/

相关文章:

javascript - 如何在 TypeScript 中捕获 "this"

mysql - 在 SQL 中聚合模型 "through"其他模型?

html - 将 Lottie Player 安装到 Angular

c++ - 使用多个参数调用构造函数

java - Q : Abstract class object initiation code?

javascript - 如何在 Angular 应用程序中从 WordPress 检查用户角色

javascript - JavaScript 中可链接的、基于 Promise 的类接口(interface)

java - Java 构造函数的默认访问修饰符

c++ - 如何在 C++ 中使父类(super class)的虚函数可被孙子覆盖?

java - 基于另一个抽象类的子类创建抽象类的子类,而不知道它们的类型