javascript - ESLint pravilo koje zahtijeva streličaste funkcije u klasama kada se referencira `this`


Postoji li ESLint pravilo kojim se nalaže korištenje arrow funkcija u klasama, kad god se referencira this.

Javascript je poznat po čudnoj semantici vezanoj uz to kako je this vezan za funkciju.

Ponekad je poželjno da this bude vezan za pozivatelja, međutim kod metoda klase, gotovo uvijek to nije bila namjera programera.

Često može dovesti do neočekivanog ponašanja kada se metoda klase koristi kao funkcija višeg reda.

Volio bih imati ESLint pravilo koje će me upozoriti kada metoda klase NIJE definirana kao arrow funkcija.

Nametnut primjer zašto je ovo ponašanje nepoželjno:

type CelebrateBirthday = () => number

class Person {
    name: string
    age: number

    constructor(name: string, age: number) {
      this.name = name
      this.age = age
    }

    celebrateBirthday(): number {
      return ++this.age
    }

    celebratBirthdayArrow = (): number => {
      return ++this.age
    }
}


function celebrateBirthdayAndPrintAge(birthdayCelebrationFn: CelebrateBirthday) {
  console.log("Happy birthday, you are " + birthdayCelebrationFn() + " years old")
}


const person = new Person("bob", 10)

// works
celebrateBirthdayAndPrintAge(person.celebratBirthdayArrow)
// throws error "this is undefined"
celebrateBirthdayAndPrintAge(person.celebrateBirthday)

TS Playground veza za gore navedeni kod

Odgovor #1

Možete koristiti ovaj lint -> https://www.npmjs.com/package/eslint-plugin-prefer-arrow-functions

Mogu koristiti s ovom konfiguracijom lintanja:

 "rules": {
      "prefer-arrow-functions/prefer-arrow-functions": [
        "warn",
        {
          "classPropertiesAllowed": true,
          "disallowPrototype": false,
          "returnStyle": "unchanged",
          "singleReturnOnly": false
        }
      ],

Odgovor #2

Arrow funkcija po dizajnu ne veže ništa za this. Dakle, pokušaj pisanja arrow funkcija unutar definicije klase znači da ne možete pristupiti this, što je jedan od glavnih razloga za korištenje klase... pristup lokalnim podacima i metodama.

Pravilo ESLint-a za traženje onoga što tražiš zapravo bi narušilo ono što tvoja klasa pokušava učiniti.