ESLint问题:no-unused-expressions规则为何触发报错?
关于三元运算符触发ESLint @typescript-eslint/no-unused-expressions规则的疑问
我在代码里用三元运算符结合加减赋值运算符修改SVG元素的像素位置变量,代码如下:
target === 'L' ? (endX -= edgeShift) : (endX += edgeShift); source === 'L' ? (startX += halfSize) : (startX -= halfSize); target === 'T' ? (endY -= edgeShift) : (endY += (edgeShift + 12));
但触发了ESLint的@typescript-eslint/no-unused-expressions规则报错。我觉得三元两侧都在修改程序状态,不该报错。现在没法查看allowTernary的配置值,文档也没明确它为false时的预期行为,想请教:
- 报错原因是什么?
- 能不能不修改配置,用单行代码实现该逻辑?不想用两行if/else,会降低可读性。
问题1:报错原因
@typescript-eslint/no-unused-expressions规则默认将独立存在的三元表达式判定为“未使用的表达式”——哪怕表达式两边都带副作用(比如变量赋值)。当allowTernary配置为false(默认值即为false)时,规则会认为这种“仅用三元做流程控制、不使用返回值”的写法不符合规范,因为三元运算符的设计初衷是返回一个值,而非单纯执行分支语句。
问题2:不修改配置的单行实现方案
有两种方式可以保持单行写法且不触发规则:
方案1:用逗号运算符包裹分支逻辑,让三元返回占位值
把赋值操作放在逗号运算符左侧,最后返回一个无意义的空值(比如void 0),让规则认为表达式有明确的返回结果:
target === 'L' ? (endX -= edgeShift, void 0) : (endX += edgeShift, void 0); source === 'L' ? (startX += halfSize, void 0) : (startX -= halfSize, void 0); target === 'T' ? (endY -= edgeShift, void 0) : (endY += edgeShift + 12, void 0);
方案2:将三元返回值直接用于赋值操作
重构逻辑,把条件判断转化为赋值的系数,让三元的返回值直接参与加减赋值,完全符合规则对“表达式需被使用”的要求:
endX += target === 'L' ? -edgeShift : edgeShift; startX += source === 'L' ? halfSize : -halfSize; endY += target === 'T' ? -edgeShift : edgeShift + 12;
这种写法更简洁,也更贴合三元运算符的设计意图。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

