TypeScript: komma åt yttre "this" från en inbäddad klassisk funktion utan att bryta linter-regeln "no-this-alias"
Vi använder Airbnbs eslint-konfiguration i vårt TypeScript-projekt, och den inkluderar regeln no-this-alias.
Och det får mig att undra hur jag kan få åtkomst till det yttre this från en inbäddad klassisk funktion, utan att bryta denna regel?
Här är koden:
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);
}
}
Händelsehanteringsfunktionen anropas från händelsebiblioteket och använder fn.call(this, e) för att sätta this till händelseobjektet, i händelsehanterarens scope. Självklart är det inte tillämpligt att använda arrow-funktionen här.
Lintaren har ett problem med raden const self=this;.
Jag vet att detta är tillåtet: const { thisOneProperty }=this, och sedan kan man använda thisOneProperty i den inbäddade funktionens kod. Men det är ingen hjälp när egenskapens värde uppdateras.
Detta fungerar också: const myClass={ t: this };, och sedan kan jag göra myClass.t för att komma åt det. Men det är så fult.
Vad är det "rena" sättet att komma åt MyClass:s this från eventhanteringsfunktionen då?
Svar #1
Testa detta
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);
}
}
