打字稿:(中间值)。(...)在从派生的class调用parentclass的方法时不是函数

Typescript: (intermediate value).(...) is not a function when call a method of parent class from derived class

这是我的 parent class,它有 trigger 方法,即 public 方法:

class BaseEffect {
    //properties and contructor...
    //other methods...

    public trigger = (): void => void (this.target.hitPoint -= this.amount);
}

并且 TurnBasedEffect 扩展 BaseEffect class:

class TurnBasedEffect extends BaseEffect {
    //properties and contructor...
    //other methods...

    public trigger = (): void => {
        super.trigger();
        this.remainingTurns--;
    };
}

这个class也有trigger方法,在这个方法里面调用了parentclass的一个trigger方法。

问题是当调用派生 class 的 trigger 方法时,打字稿会抛出此错误:

TypeError: (intermediate value).trigger is not a function

并指向TurnBasedEffectclass的trigger方法的这一行:

//...
super.trigger();
//...

我的 classes 有什么问题,如何解决这个问题?

你有一个初始化为箭头函数的字段。初始化由构造函数完成:

class Foo {
    bar = () => {};
}

console.log(new Foo().bar);
console.log(new Foo().hasOwnProperty('bar'));
console.log(Foo.prototype.bar);

该字段没有在原型链中结束,所以不被继承,不能通过super调用。

我建议写正常的方法:

class BaseEffect {
    //properties and contructor...
    //other methods...

    public trigger() {
        this.target.hitPoint -= this.amount;
    }
}

class TurnBasedEffect extends BaseEffect {
    //properties and contructor...
    //other methods...

    public trigger() {
        super.trigger();
        this.remainingTurns--;
    }
}