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
Примеры неправильного кода для этого правила:
/*eslint class-methods-use-this: "error"*/
class A {
() {
console.log("Hello World"); /*error Expected 'this' to be used by class method 'foo'.*/
}
}
Примеры правильного кода для этого правила:
/*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":
/*eslint class-methods-use-this: "error"*/
class A {
() {
}
}
Примеры правильного кода для этого правила, когда используется exceptMethods:
/*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 } (по умолчанию):
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": true }] */
class A {
() => {}
}
Примеры правильного кода для этого правила с параметром { "enforceForClassFields": true } (по умолчанию):
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": true }] */
class A {
foo = () => {this;}
}
Примеры правильного кода для этого правила с параметром { "enforceForClassFields": false }:
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": false }] */
class A {
foo = () => {}
}
Версия
Это правило было добавлено в ESLint v3.4.0.
Дополнительные материалы
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/class-methods-use-this