版本

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

延伸閱讀

資源

變更語言