# 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"*/
/*eslint-env es6*/
class A {
    foo() {
        console.log("Hello World");     /*error Expected 'this' to be used by class method 'foo'.*/
    }
}
此规则的正确代码示例:
/*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 的情况下使用此规则的错误代码示例:
/*eslint class-methods-use-this: "error"*/
class A {
    foo() {
    }
}
与 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 {
    foo = () => {}
}
带有 { "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 = () => {}
}