网站搜索

TypeScript:从嵌套的经典函数访问外层的“this”,而不违反 linter 的“no-this-alias”规则


我们在 TypeScript 项目中使用 Airbnb 的 eslint 配置,其中包括 no-this-alias 规则。

这让我想知道,我如何能从嵌套的传统函数中访问外部的 this,而不违反这个规则?

这是代码:

class MyClass {
 
  name: string;

  target: EventTarget;
 
  constructor(name: string, target: EventTarget) {
    this.name = name;
    this.target = target;
  }
 
  initEventHandlers() {
    const self = this;
    function exampleEventHandler(this: EventTarget, e: Event) {
      console.log(this.somethingFromTheTarget);
      console.log(self.somethingFromMyClass);
    }
    this.target.addEventListener('exampleEvent', exampleEventHandler);
  }
}

事件处理函数是从事件库中调用的,使用 fn.call(this, e) 将 this 设置为事件目标,在事件处理函数的作用域中。显然,这里不适用箭头函数。

检查器对 const self=this; 这一行有问题。

我知道这是允许的:const { thisOneProperty }=this,然后可以在嵌套函数代码中使用thisOneProperty。但是当属性值被更新时,这没有任何好处。

这也可以:const myClass={ t: this };,然后我可以通过 myClass.t 来访问它。但那真的很丑。

那么,从事件处理函数内部访问 MyClass 的 this 的“干净”方法是什么?

答案#1

测试这个

class MyClass {
 
  name: string;

  target: EventTarget;
 
  constructor(name: string, target: EventTarget) {
    this.name = name;
    this.target = target;
  }
 
  initEventHandlers() {
    const self = {
      somethingFromMyClass: this.somethingFromMyClass.bind(this)
    };

    function exampleEventHandler(this: EventTarget, e: Event) {
      console.log(this.somethingFromTheTarget);
      console.log(self.somethingFromMyClass);
    }
    this.target.addEventListener('exampleEvent', exampleEventHandler);
  }
}