Typescript: (intermediate value).(...) 从派生类调用父类的方法时不是函数

Trí*_*han 2 javascript class super typescript

这是我的父类,它具有trigger方法,即public方法:

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

    public trigger = (): void => void (this.target.hitPoint -= this.amount);
}
Run Code Online (Sandbox Code Playgroud)

和一个TurnBasedEffect扩展BaseEffect类:

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

    public trigger = (): void => {
        super.trigger();
        this.remainingTurns--;
    };
}
Run Code Online (Sandbox Code Playgroud)

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

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

TypeError: (intermediate value).trigger is not a function
Run Code Online (Sandbox Code Playgroud)

并指向该类trigger方法的这一行TurnBasedEffect

//...
super.trigger();
//...
Run Code Online (Sandbox Code Playgroud)

我的课程有什么问题以及如何解决这个问题?

Ry-*_*Ry- 5

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

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

console.log(new Foo().bar);
console.log(new Foo().hasOwnProperty('bar'));
console.log(Foo.prototype.bar);
Run Code Online (Sandbox Code Playgroud)

该字段不会在原型链中结束,因此它不会被继承,并且您不能通过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--;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ceruleus:在构造函数中,您可以在覆盖它之前捕获其原始值。 (2认同)