typescript - 我可以有 `super` 或这个,但不能两者都有?

标签 typescript

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

如果我声明一个函数为

foo = () => {}

然后我可以安全地在函数中使用this

但是我不能使用super.foo(),因为我得到了错误

TypeError:(中间值).foo 不是函数

如果我将函数声明为

foo() { }

然后我可以使用super.foo()但我不能确定this是否指向同一个“this”始终,取决于函数的调用方式

我该如何解决这个问题?我已经看到一些建议,我必须双重声明所有函数并将 bind 一个函数与另一个函数相结合,但这似乎很荒谬.. typescript 没有一些“神奇”的语法糖来覆盖所有这种丑陋?

谢谢;)

最佳答案

类方法可以在实例原型(prototype) 上。不幸的是,你不能既吃蛋糕又吃蛋糕。

当方法在实例上时,每个类实例的每个方法都有一个闭包,并且每个实例的闭包都有自己的 _this 副本,因此可以任意调用该函数。但是因为方法绑定(bind)到实例,派生类的实例化不会使用基类的方法代码创建任何现存的方法。

当方法在原型(prototype)上时,每个方法都有一个闭包,这些方法是未绑定(bind)的,因此必须使用正确的方法语法调用。在这里您可以调用基类实现,因为有一个已知位置可以从 (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;
    }
}

关于typescript - 我可以有 `super` 或这个,但不能两者都有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41230266/

相关文章:

node.js - webpack 不支持 require.extensions。改用装载机

reactjs - typescript :React.forwardRef 带有来自@material-ui 的通用 Prop

typescript ,方法签名的类型等效?

angular - Firebase : firebase. Promise<any> 与 Rxjs Promise<any> 的兼容性

javascript - 类型错误 : Cannot read property 'index' of null in Angular2

javascript - Webpack 文件加载器不加载具有复杂路径的文件

javascript - 强制 Aurelia 使用相同组件但不同路由参数调用新路由的生命周期方法

angular - 除了设计简单之外,在 Angular2 中使用多个模块还有什么好处?

typescript - Observable 中的 observer.throw 和 observer.error 有什么区别?

json - Angular 4 - 将 JSON 映射到模型,反之亦然