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

时间:2018-08-15 18:50:43

标签: 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()添加到每个子类的构造函数中。

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

1 个答案:

答案 0 :(得分:1)

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

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()            
    }
}

希望它应该能按您期望的那样工作。