Typescript 我可以要“超级”或这个,但不能两者都要?
我一直在用Typescript(2.1)和类,特别是扩展另一个类的类,把我的一点头发扯下来 如果我将函数声明为Typescript 我可以要“超级”或这个,但不能两者都要?,typescript,Typescript,我一直在用Typescript(2.1)和类,特别是扩展另一个类的类,把我的一点头发扯下来 如果我将函数声明为 foo=()=>{} 这样我就可以在函数中安全地使用这个 但是我不能使用super.foo(),因为我得到了错误 TypeError:(中间值)。foo不是函数 如果我将函数声明为 foo(){} 然后我可以使用super.foo(),但我不能确定this始终指向同一个“this”,这取决于调用函数的方式 我如何避开这个问题?我看到一些建议,我必须双重声明所有函数,并将一个绑定到另一个
foo=()=>{}
这样我就可以在函数中安全地使用这个
但是我不能使用super.foo()
,因为我得到了错误
TypeError:(中间值)。foo不是函数
如果我将函数声明为
foo(){}
然后我可以使用super.foo()
,但我不能确定this
始终指向同一个“this”,这取决于调用函数的方式
我如何避开这个问题?我看到一些建议,我必须双重声明所有函数,并将一个绑定到另一个,但这似乎很荒谬。。typescript不是有一些“神奇”的语法糖衣覆盖了所有这些丑陋的东西吗
谢谢;) 类方法可以在实例或原型上。不幸的是,你不能既吃蛋糕又吃蛋糕
当一个方法在实例上时,每个类实例的每个方法都有一个闭包,每个实例的闭包都有自己的\u this
副本,这使得函数可以被任意调用。但是,由于方法绑定到实例,因此派生类的安装不会使用基类的方法代码创建任何现有方法
当原型上有一个方法时,每个方法有一个闭包,这些方法是未绑定的,因此必须使用正确的方法语法调用。在这里,您可以调用基类实现,因为有一个已知的位置可以从中获取基类方法(BaseClass.prototype.methodName
)
一个好的解决方案是编写一个protectedstatic
基类方法来处理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;
}
}
谢谢你的解释-我会玩这个结构,让它在我的脑海中清晰,然后回来。