Typescript重写了类方法和这个

Jor*_*orn 5 typescript

我有这两个Typescript类:

class Base {
  value: string;

  lambdaExample = () => {
    this.value = 'one';
  }

  methodExample() {
    this.value = 'two';
  }
}

class Child extends Base {
  lambdaExample = () => {
    super.lambdaExample(); // Error, because I've overwritten (instead of overridden) the method
    this.value = 'three'; // ok
  }

  methodExample() => {
    super.methodExample(); // ok
    this.value = 'four'; // Error: this refers to window, not to the actual this
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎样写我的这样一种方式,方法this的引用是可靠的,而且我可以覆盖的方法和从父类打电话给他们?

San*_*ord 4

实际上,在Microsoft 的 Git Wiki上可以很好地了解解决此问题的不同方法。本质上可以归结为:

  • 如果您关心继承,则每次从不同的上下文调用该方法时都绑定或包装该方法。
  • 如果不这样做,请将方法转换为包含函数的属性。

实际的 Wiki 中还有更多规定,我强烈建议您阅读整篇内容。

编辑

包装的一个例子:

鉴于班级

class SomeClass {
    public someProp: string = "Hello World";

    public someMethod() {
        console.log(this.someProp);
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您要从someMethod(例如)单击处理程序调用 - someEl.onclick = instanceOfMyClass.someMethod;- 将引发异常(假设window没有属性someProp)。

您可以通过将函数绑定到instanceOfMyClass(不是类型安全的,不兼容 ES6)或手动包装它(无论如何,实际上是 bind 正在做的事情)来规避这个问题:

someEl.onclick = function() {
    someInstanceOfMyClass.someMethod();
};
Run Code Online (Sandbox Code Playgroud)

它有点冗长和迂腐,但通过将其someMethod作为 的属性调用someInstanceOfMyClass而不将其传递到事件处理程序(这会将其转换为 的属性window),您可以确保this始终是 的实例MyClass