Typescript 我可以要“超级”或这个,但不能两者都要?

Typescript 我可以要“超级”或这个,但不能两者都要?,typescript,Typescript,我一直在用Typescript(2.1)和类,特别是扩展另一个类的类,把我的一点头发扯下来 如果我将函数声明为 foo=()=>{} 这样我就可以在函数中安全地使用这个 但是我不能使用super.foo(),因为我得到了错误 TypeError:(中间值)。foo不是函数 如果我将函数声明为 foo(){} 然后我可以使用super.foo(),但我不能确定this始终指向同一个“this”,这取决于调用函数的方式 我如何避开这个问题?我看到一些建议,我必须双重声明所有函数,并将一个绑定到另一个

我一直在用Typescript(2.1)和类,特别是扩展另一个类的类,把我的一点头发扯下来

如果我将函数声明为

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;
    }
}

谢谢你的解释-我会玩这个结构,让它在我的脑海中清晰,然后回来。