版本

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

延伸阅读

资源

更改语言