@typescript-eslint/no-unnecessary-condition能否识别await期间可变变量的变化?
问题
我们代码库中多次使用可变布尔变量控制异步任务是否中途终止,示例代码如下:
async function doTask(task: number) { // Do some work } class TaskRunner { isRunning = false stopRunning = () => { this.isRunning = false } runTasks = async () => { this.isRunning = true await doTask(1) if (!this.isRunning) return // <-- 被@typescript-eslint/no-unnecessary-condition标记为"不必要的条件判断,值始终为假" await doTask(2) } }
实际场景中,isRunning可能在await doTask(1)执行期间被外部调用stopRunning修改,但@typescript-eslint/no-unnecessary-condition规则无法识别这种异步场景下的变量变更,误报了不必要的条件判断。请问有没有办法让该规则正确识别这种情况?
解决方案
以下几种方法可解决该误报问题:
给变量添加类访问修饰符:给
isRunning加上private或protected修饰符,规则会默认认为这类变量可能被类的其他方法修改,从而跳过对该条件的检查:class TaskRunner { private isRunning = false stopRunning = () => { this.isRunning = false } runTasks = async () => { this.isRunning = true await doTask(1) if (!this.isRunning) return // 不再触发误报 await doTask(2) } }临时禁用该行规则:在条件判断行添加ESLint忽略注释,适合仅需处理个别场景的情况:
if (!this.isRunning) return // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition用引用类型包装变量:将布尔变量包装成
{ value: boolean }这样的引用类型,让规则识别到变量值可能被外部修改:class TaskRunner { isRunning = { value: false } stopRunning = () => { this.isRunning.value = false } runTasks = async () => { this.isRunning.value = true await doTask(1) if (!this.isRunning.value) return // 不再触发误报 await doTask(2) } }调整规则配置:在ESLint配置中给
@typescript-eslint/no-unnecessary-condition添加allowConstantLoopConditions选项,但该选项主要适配循环场景,对异步中断的支持有限,优先推荐前三种方法。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

