
拆解 eslint-plugin-unicorn 的 no-useless-compound-assignment揪出 x 0 却不自动修【免费下载链接】eslint-plugin-unicornMore than 300 powerful ESLint rules项目地址: https://gitcode.com/GitHub_Trending/es/eslint-plugin-unicorn你的代码里躺着这样一行let total getTotal(); total 0;eslint-plugin-unicorn 的 no-useless-compound-assignment 会判定它是无用的复合赋值修复却只做建议、绝不自动改写——为什么不给自动修复为什么它只给建议、拒绝自动修复它的元数据里只有hasSuggestions: true没有 fix。原因一句话「输入→判定→输出」链条的判定环节拿不到关键信息。规则看到的输入是一个AssignmentExpression右值是字面量这些都没问题但复合赋值的最终结果由左值在运行时是什么类型决定而 AST 里恰恰没有这个信息。同一个x 0x a; x 0; // 结果是 a0字符串拼接 x 5; x * 1; // 字符串被隐式转成数字 5 x 5n; x * 1; // BigInt 与 Number 混算抛 TypeError x -0; x 0; // -0 被翻成 0 四种左值、同一种写法、四种结局。自动修复承诺的是「任何时候都安全」而这里只能承诺「大多数时候安全」——差的那一点点就是建议与修复的分界线。所以输出被降级为编辑器建议报错照报修复由你点一下确认规则文档 里明确写着这层考量。它的「通缉名单」哪五种复合赋值会被盯上规则只检测五种算术运算符与各自恒等值的组合起点是 规则源码 里一张五行的映射表const noOpAssignments new Map([ [, 0], [-, 0], [*, 1], [/, 1], [**, 1], ]);判定是两步过滤先查运算符在不在表里再对右值过isNumericLiteralnode.type Literal typeof node.value number比对归一化后的 value。正因为比的是 value换装的写法照样命中写法归一化 value结果x 0.00命中x / 1.01命中x * 0x11命中x - 0e30命中而报错信息取的是node.right.raw原文x 0.0的提示会原样保留 0.0报错快照 里逐条可查。表外的一律不查x 1、x * 2这类真正改变值的运算x * 0、x / 0这类拿错恒等值的写法都安静躺在 valid 名单里。哪些写法它主动放走名单之外的写法一律放行不会误伤有意图的写法——其中位运算的豁免最容易被误读。为什么x | 0不报错它不是失误而是把浮点数强转成 32 位整数的惯用写法源码注释写明这是刻意排除的 int32/uint32 coercion 惯用法同族还有x 0、x -1、x ^ 0、x 0、x 0。你可以把它理解成| 0是在说「给我 int32」而 0是在说「我好像忘了什么」。其余放行项各有理由放行的写法原因x % 1x % 1得到的是小数部分不是恒等x \|\| 0、x 1、x ?? 0逻辑赋值语义与算术恒等无关x 0、x 1普通赋值不属复合赋值x 0n、x * 1nBigInt 字面量的 value 不是 numberx -0、x * 1一元表达式且并非恒等操作x y、x * zero、x foo()运行时值无法静态确定x 0 as numberTS 类型断言节点不是纯字面量测试用例 的 valid 列表就是这份豁免清单的逐条验收。怎么修看它站在哪删整句、换左值还是收手命中之后规则先问一句删掉它赋值的结果还在被使用吗三个分支对应三种处置。删除整句赋值被 ExpressionStatement 直接包住且这个语句的外层父节点是 Program、BlockStatement、StaticBlock 或 SwitchCase 之一——独立成句结果无人使用。建议走 removeStatement 助手rules/fix/remove-statement.js连同语句四周的空白一起吃掉但语句之外的尾随注释保留x 0; // keep应用建议后// keep还在。替换为左值结果被使用时foo(x 0)、return count - 0、a x 0、逗号表达式、for的更新表达式删除会破坏语义建议改用fixer.replaceText(node, sourceCode.getText(node.left))把整个表达式换成左值if (a) x 0 /* keep */;这类只替换赋值本身注释留在原地。⚠️ 体内有注释则收手x /* keep */ 0;无论删句还是替换都会吞掉注释规则只报错、不给任何建议走删除分支时分号前的注释同样算「体内」。两个分支的边界其实是一条线赋值是否被 ExpressionStatement 直接包住、且语句独立存在。a x 0看起来像独立语句但它是另一条赋值的右值走的是替换分支。// ❌ 结果被 return 使用 return count - 0; // ✅ 建议替换为左值 return count;打开它需要几步零步recommended 与 unopinionated 两套配置默认启用规则不接收任何选项。元数据是type: suggestion、docs.recommended: unopinionated、hasSuggestions: truereadme 规则总表里标着manually fixable by editor suggestions。你的 ESLint 配置只要引入 unicorn 的推荐预设就生效即使手动显式开启也只有一个级别参数没有任何第二项可调。unopinionated 的含义是「不掺风格偏好」这条规则只清理无争议的死代码不替你决定变量该怎么命名、代码该怎么组织所以它被放在这一档。这个规则的价值不在发现而在克制它把「AST 上恒等、运行时未必恒等」的灰色地带收敛成一次需要你点头的建议。想继续往下看规则源码、test/no-useless-compound-assignment.js、test/snapshots/no-useless-compound-assignment.js.snapshot、docs/rules/no-useless-compound-assignment.md。【免费下载链接】eslint-plugin-unicornMore than 300 powerful ESLint rules项目地址: https://gitcode.com/GitHub_Trending/es/eslint-plugin-unicorn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考