You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时的预期行为,想请教:

  1. 报错原因是什么?
  2. 能不能不修改配置,用单行代码实现该逻辑?不想用两行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:43:13