跳至主要内容

未绑定方法

强制未绑定方法使用其预期作用域进行调用。

💭

此规则需要 类型信息 才能运行。

类方法函数在作为独立变量(“未绑定”)传递时不会保留类作用域。如果您的函数不访问 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;
在游乐场中打开

选项

此规则接受以下选项

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。如果您在启用类型检查的规则后遇到性能下降,请参阅 性能故障排除

资源