我一直在使用Typescript(2.1)和类撕掉我的头发,特别是扩展另一个类的类。
如果我将函数声明为
foo = () => {}
然后我可以安全地在函数
中使用this
但我无法使用super.foo()
,因为我收到了错误
TypeError: (intermediate value).foo is not a function
如果我将该函数声明为
foo() { }
然后我可以使用super.foo()
,但我无法确定this
是否指向同一个"这个"所有的时间,取决于函数的调用方式
如何解决这个问题?我已经看到了一些建议,我必须双重声明所有的功能,并bind
一个到另一个,但这看起来很荒谬..没有打字稿有一些"魔法&#34 ;语法糖包括所有这些丑陋?
谢谢;)
答案 0 :(得分:1)
类方法可以位于实例或原型上。不幸的是,你不能吃蛋糕也不能吃。
当一个方法在实例上时,每个类实例的每个方法都会得到一个闭包,并且每个实例的闭包都有自己的_this
副本,因此可以任意调用该函数。但由于方法绑定到实例,派生类的instatation不会使用基类的方法代码创建任何现存方法。
当一个方法在原型上时,每个方法得到一个闭包,这些方法是未绑定的,因此必须使用正确的方法语法调用。在这里你可以调用基类实现,因为有一个已知的位置来从(BaseClass.prototype.methodName
)获取基类方法。
一个好的解决方案是编写一个protected static
基类方法来处理foo
将调用的逻辑,并让你的实例方法遵循静态方法。这是两个世界中最好的,代价是一个间接层。
示例:
class Base {
protected static foo(instance: Base) {
instance.counter++;
}
counter = 0;
foo = () => Base.foo(this);
}
class Derived extends Base {
foo = () => {
Base.foo(this);
this.counter *= 2;
}
}