打字稿:(中间值)。(...)在从派生的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
并指向TurnBasedEffect
class的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--;
}
}
这是我的 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
并指向TurnBasedEffect
class的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--;
}
}