Spec-Zone.ru › ESLint

class-methods-use-this

Требует, чтобы методы класса использовали this

Если метод класса не использует this, его иногда можно преобразовать в статический метод. Если вы преобразуете метод в статический метод, экземпляры класса, вызывающие этот метод, также должны быть преобразованы в вызов статического метода (MyClass.callStaticMethod())

Возможен случай, когда метод класса не использует this, например:

class A {
    constructor() {
        this.a = "hi";
    }

    print() {
        console.log(this.a);
    }

    sayHi() {
        console.log("hi");
    }
}

let a = new A();
a.sayHi(); // => "hi"

В приведенном выше примере метод sayHi не использует this, поэтому мы можем сделать его статическим методом:

class A {
    constructor() {
        this.a = "hi";
    }

    print() {
        console.log(this.a);
    }

    static sayHi() {
        console.log("hi");
    }
}

A.sayHi(); // => "hi"

Обратите также внимание, что если вы переключаете метод на статический метод, экземпляры класса, вызывающие статический метод (let a = new A(); a.sayHi();) должны быть обновлены на вызов статического метода (A.sayHi();) вместо вызова метода экземпляром класса.

Подробности правила

Это правило предназначено для выявления методов класса, которые не используют this

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint class-methods-use-this: "error"*/

class A {
    foo() {
        console.log("Hello World");     /*error Expected 'this' to be used by class method 'foo'.*/
    }
}

Примеры правильного кода для этого правила:

Открыть в Playground
/*eslint class-methods-use-this: "error"*/

class A {
    foo() {
        this.bar = "Hello World"; // OK, this is used
    }
}

class B {
    constructor() {
        // OK. constructor is exempt
    }
}

class C {
    static foo() {
        // OK. static methods aren't expected to use this.
    }

    static {
        // OK. static blocks are exempt.
    }
}

Параметры

Это правило имеет два параметра:

  • "exceptMethods" позволяет игнорировать указанные имена методов.
  • "enforceForClassFields" требует, чтобы функции, используемые в качестве инициализаторов полей экземпляра, использовали this. (по умолчанию: true)

exceptMethods

"class-methods-use-this": [<enabled>, { "exceptMethods": [<...exceptions>] }]

Параметр "exceptMethods" позволяет передать массив имён методов, для которых необходимо игнорировать предупреждения. Например, у вас может быть спецификация из внешней библиотеки, требующая перезаписи метода как обычной функции (а не статического метода) и не использующая this внутри тела функции. В этом случае вы можете добавить этот метод в игнорируемые методы.

Примеры неправильного кода для этого правила, когда не используется "exceptMethods":

Открыть в Playground
/*eslint class-methods-use-this: "error"*/

class A {
    foo() {
    }
}

Примеры правильного кода для этого правила, когда используется exceptMethods:

Открыть в Playground
/*eslint class-methods-use-this: ["error", { "exceptMethods": ["foo", "#bar"] }] */

class A {
    foo() {
    }
    #bar() {
    }
}

enforceForClassFields

"class-methods-use-this": [<enabled>, { "enforceForClassFields": true | false }]

Параметр enforceForClassFields требует, чтобы стрелочные функции и выражения функций, используемые в качестве инициализаторов полей экземпляра, использовали this. (по умолчанию: true)

Примеры неправильного кода для этого правила с параметром { "enforceForClassFields": true } (по умолчанию):

Открыть в Playground
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": true }] */

class A {
    foo = () => {}
}

Примеры правильного кода для этого правила с параметром { "enforceForClassFields": true } (по умолчанию):

Открыть в Playground
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": true }] */

class A {
    foo = () => {this;}
}

Примеры правильного кода для этого правила с параметром { "enforceForClassFields": false }:

Открыть в Playground
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": false }] */

class A {
    foo = () => {}
}

Версия

Это правило было добавлено в ESLint v3.4.0.

Дополнительные материалы

Классы - JavaScript | MDN
static - JavaScript | MDN

Ресурсы

  • Исходный код правила
  • Тесты

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/class-methods-use-this

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API