我可以有'超级'或者这个,但不是两者都有?

时间:2016-12-19 20:12:02

标签: typescript

我一直在使用Typescript(2.1)和类撕掉我的头发,特别是扩展另一个类的类。

如果我将函数声明为

foo = () => {}

然后我可以安全地在函数

中使用this

我无法使用super.foo(),因为我收到了错误

TypeError: (intermediate value).foo is not a function

如果我将该函数声明为

foo() { }

然后我可以使用super.foo(),但我无法确定this是否指向同一个"这个"所有的时间,取决于函数的调用方式

如何解决这个问题?我已经看到了一些建议,我必须双重声明所有的功能,并bind一个到另一个,但这看起来很荒谬..没有打字稿有一些"魔法&#34 ;语法糖包括所有这些丑陋?

谢谢;)

1 个答案:

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