Versions

class-methods-use-this

Enforce that class methods utilize 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 的类方法。

使用此规则的错误示例:

Open in Playground
/*eslint class-methods-use-this: "error"*/
/*eslint-env es6*/

class A {
    foo() {
        console.log("Hello World");     /*error Expected 'this' to be used by class method 'foo'.*/
    }
}

使用此规则的正确示例:

Open in Playground
/*eslint class-methods-use-this: "error"*/
/*eslint-env es6*/
class A {
    foo() {
        this.bar = "Hello World"; // OK, this is used
    }
}

class A {
    constructor() {
        // OK. constructor is exempt
    }
}

class A {
    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"错误示例:

Open in Playground
/*eslint class-methods-use-this: "error"*/

class A {
    foo() {
    }
}

使用此规则与 exceptMethods正确示例:

Open in 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 } 选项的错误示例:

Open in Playground
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": true }] */

class A {
    foo = () => {}
}

使用此规则与默认的 { "enforceForClassFields": true } 选项的正确示例:

Open in Playground
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": true }] */

class A {
    foo = () => {this;}
}

使用此规则与 { "enforceForClassFields": false } 选项的正确示例:

Open in Playground
/*eslint class-methods-use-this: ["error", { "enforceForClassFields": false }] */

class A {
    foo = () => {}
}

Version

This rule was introduced in ESLint v3.4.0.

Further Reading

Resources

更改语言