未绑定方法
强制未绑定方法使用其预期作用域进行调用。
💭
此规则需要 类型信息 才能运行。
类方法函数在作为独立变量(“未绑定”)传递时不会保留类作用域。如果您的函数不访问 this
,您可以使用 this: void
对其进行注释,或者考虑使用箭头函数。否则,将类方法作为值传递可能会通过无法捕获 this
来移除类型安全。
此规则报告类方法以未绑定方式引用时的情况。
提示
如果您正在使用 jest
,您可以使用 eslint-plugin-jest
的规则版本 来 lint 测试文件,该规则知道何时可以将未绑定的方法传递给 expect
调用。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/unbound-method": "error"
}
};
在游乐场中尝试此规则 ↗
示例
- ❌ 错误
- ✅ 正确
class MyClass {
public log(): void {
console.log(this);
}
}
const instance = new MyClass();
// This logs the global scope (`window`/`global`), not the class instance
const myLog = instance.log;
myLog();
// This log might later be called with an incorrect scope
const { log } = instance;
// arith.double may refer to `this` internally
const arith = {
double(x: number): number {
return x * 2;
},
};
const { double } = arith;
在游乐场中打开class MyClass {
public logUnbound(): void {
console.log(this);
}
public logBound = () => console.log(this);
}
const instance = new MyClass();
// logBound will always be bound with the correct scope
const { logBound } = instance;
logBound();
// .bind and lambdas will also add a correct scope
const dotBindLog = instance.logUnbound.bind(instance);
const innerLog = () => instance.logUnbound();
// arith.double explicitly declares that it does not refer to `this` internally
const arith = {
double(this: void, x: number): number {
return x * 2;
},
};
const { double } = arith;
在游乐场中打开选项
此规则接受以下选项
type Options = [
{
/** Whether to skip checking whether `static` methods are correctly bound. */
ignoreStatic?: boolean;
},
];
const defaultOptions: Options = [{ ignoreStatic: false }];
ignoreStatic
使用 { ignoreStatic: true }
时,此规则的正确代码示例
class OtherClass {
static log() {
console.log(OtherClass);
}
}
// With `ignoreStatic`, statics are assumed to not rely on a particular scope
const { log } = OtherClass;
log();
在游乐场中打开何时不使用它
如果您的项目以 TypeScript 难以建模的方式动态更改 this
作用域,则此规则可能不可行。例如,某些函数具有用于指定 this
上下文的附加参数,例如 Reflect.apply
,以及数组方法,例如 Array.prototype.map
。TypeScript 难以表达这种语义。您可能考虑使用 ESLint 禁用注释 来处理这些特定情况,而不是完全禁用此规则。
如果您想在 jest
测试中使用 toBeCalled
和类似匹配项,您可以为测试文件禁用此规则,转而使用 eslint-plugin-jest
的规则版本。
类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查的规则后遇到性能下降,请参阅 性能故障排除。