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 中引入。