
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 中引入。
延伸閱讀

