
当 eslint 规则(如 @typescript-eslint/no-misused-promises)在根 rules 中设为 “off” 却仍被触发时,极可能因 overrides 配置块中重复启用了该规则——需在对应 overrides 内显式关闭。
当 eslint 规则(如 @typescript-eslint/no-misused-promises)在根 rules 中设为 “off” 却仍被触发时,极可能因 overrides 配置块中重复启用了该规则——需在对应 overrides 内显式关闭。
在 TypeScript 项目中使用 ESLint 时,一个常见却易被忽视的问题是:明明已在 .eslintrc.js 的顶层 rules 中将某条规则设为 “off”,但该规则警告依然出现。典型案例如 @typescript-eslint/no-floating-promises 或 @typescript-eslint/no-misused-promises ——它们常由 @typescript-eslint/recommended-type-checked 等共享配置自动启用,而这类配置往往通过 overrides 块注入,优先级高于顶层 rules。
ESLint 的配置合并机制规定:overrides 中定义的 rules 会完全覆盖(而非合并)顶层 rules 的同名设置。因此,即使你在根配置中写了:
module.exports = { rules: { "@typescript-eslint/no-floating-promises": "off", }, // ... 其他配置 };
只要存在如下 overrides(常见于 TypeScript 项目模板):
overrides: [ { files: ["**/*.ts"], extends: ["@typescript-eslint/recommended-type-checked"], } ]
那么 @typescript-eslint/recommended-type-checked 所含的默认规则(包括 “Error” 级别的 no-floating-promises)就会在 .ts 文件中生效,彻底忽略顶层的 “off” 设置。
✅ 正确做法是:在触发该规则的 overrides 块内,显式重写对应规则:
module.exports = { // 根规则(对非 TS 文件等生效) rules: { // 可保留通用规则 }, overrides: [ { files: ["**/*.ts", "**/*.tsx"], extends: ["@typescript-eslint/recommended-type-checked"], parserOptions: { project: "./tsconfig.json", }, rules: { // ✅ 关键:在此处关闭,覆盖继承的规则 "@typescript-eslint/no-floating-promises": "off", "@typescript-eslint/no-misused-promises": "off", // 如需部分启用,也可设为 "warn" 或自定义选项 // "@typescript-eslint/no-floating-promises": ["warn", { ignoreVoid: true }], }, }, ], };
⚠️ 注意事项:
- overrides 是数组,需确保目标 override 块的 files 模式精确匹配你的源文件(如 **/*.ts 不匹配 .tsx,需补充);
- 若使用多个 extends(如同时扩展 eslint:recommended 和 @typescript-eslint),检查所有 overrides 是否都需修正;
- 运行 npx eslint –print-config path/to/file.ts 可查看 ESLint 实际解析后的完整配置,快速定位规则来源;
- 清除缓存(–cache –cache-location .eslintcache)或重启编辑器语言服务器仅解决临时状态问题,无法绕过配置优先级逻辑。
总结:ESLint 的 overrides 不是“补充”,而是“作用域内重置”。要禁用某条被 extends 启用的规则,必须在同一 overrides 块内显式声明其值——这是配置可预测性的核心原则,也是调试规则失效问题的首要排查路径。