TypeScript匿名函数中已窄化变量仍报undefined类型错误如何解决
你遇到的是TypeScript控制流分析的典型限制:默认不会将外层的类型窄化结果穿透到内部回调函数中,因为TS无法确认该回调是同步立即执行的,无法保证回调执行时dest不会被重新赋值为undefined。
以下是符合TS开发规范的常用解决方案:
方案1:非空断言(最常用、最简洁)
如果你能确定dest在find回调执行前不会被修改为undefined,直接用!非空断言操作符即可,这是TS生态中处理这类问题的惯用写法:
if (orig && dest) { let pickup = drops_orig(orig, drops) if (!pickup) { return undefined } return pickup_drop(pickup, drops) .find(_ => equal(_.drop.orig, dest!)) // 加!告知TS此处dest一定非空 }
方案2:const 局部变量捕获(更高安全性)
如果后续代码可能修改外层dest的值,可以在外层非空判断作用域内用const声明一个局部变量捕获当前的非空值,const声明的变量不可修改,TS会自动推导其为非空类型:
if (orig && dest) { const safeDest = dest // const保证不可修改,TS自动识别为非空Pos类型 let pickup = drops_orig(orig, drops) if (!pickup) { return undefined } return pickup_drop(pickup, drops) .find(_ => equal(_.drop.orig, safeDest)) }
方案3:自定义类型守卫(适合不确定dest是否会变更的场景)
如果无法保证回调执行时dest一定非空,可以写个简单的类型守卫,在回调内先做判断再使用:
// 提前定义类型守卫 function isPos(val: Pos | undefined): val is Pos { return val !== undefined } // 使用时 if (orig && dest) { let pickup = drops_orig(orig, drops) if (!pickup) { return undefined } return pickup_drop(pickup, drops) .find(_ => isPos(dest) && equal(_.drop.orig, dest)) }
内容的提问来源于stack exchange,提问作者eguneys
相关产品推荐
相关产品推荐

