TypeScript同步for循环赋值后报Variable 'value' is used before being assigned
报错原因
该报错来源于TypeScript控制流分析的固有局限性,和代码是否异步无关:
- TS类型检查器不会对循环的执行次数、运行时动态值的判断逻辑做深度推导,默认认定所有
for循环都存在一次都不执行的可能性 - 第一段代码逻辑上确实会循环10次,
value一定会被赋值,但TS不会解析循环边界的具体数值来做这个判定,因此判定value存在未赋值就返回的风险 - 第二段代码同理,TS不会推导
i一定会走到i===99的分支,只会认为该条件存在不满足的可能,因此抛出相同报错
解决方案
可以根据你的实际业务场景选择以下任意一种方案:
- 方案1:变量声明时赋初始值
是最稳妥的方案,直接声明时给变量赋值符合类型的初始值,从根源消除未赋值风险:let value: number = 0; - 方案2:使用非空断言
如果你可以100%确认代码运行时value一定会被赋值,可以在使用变量的位置加!非空断言,告知TS无需校验该变量的赋值情况,该方案不会产生额外运行时代码开销,适合你第二段存在高开销函数的场景:return value!; - 方案3:显式标注允许undefined
如果确实存在循环不执行、条件不触发的场景,可以把变量类型修改为联合类型,明确允许undefined的存在:
后续使用该返回值时做好类型守卫判断即可。let value: number | undefined;
内容的提问来源于stack exchange,提问作者GuangWu
相关产品推荐
相关产品推荐

