TypeScript报错“Object is possibly 'undefined'”求解决方案
解决TypeScript中“Object is possibly 'undefined'”类型守卫失效问题
你的问题出在for...in循环中通过字符串类型的属性名访问对象时,TypeScript会优先使用接口的索引签名类型,导致你写的类型守卫无法正确缩小属性值的类型。
原因分析
你的接口FeeObjType2定义了索引签名[index: string]: number | undefined,当在for...in循环中用string类型的property访问feeObj[property]时,TypeScript会把这个值的类型判定为number | undefined——哪怕你在条件里检查了feeObj[property] !== undefined,再次访问时,TypeScript的静态分析无法确认这个值没有被修改(哪怕实际不会),所以不会自动缩小类型。
解决方案
方案1:将属性值存入变量后再检查
把属性值先赋值给一个变量,这样TypeScript能正确识别变量的类型缩小:
const sumFunc = function (feeObj: FeeObjType2): number { let total = 0; for (const property in feeObj) { const value = feeObj[property]; if (value !== undefined) { total += value; } } return total; };
方案2:使用Object.values简化逻辑
直接获取对象的所有属性值,过滤掉undefined后累加,代码更简洁:
const sumFunc = function (feeObj: FeeObjType2): number { return Object.values(feeObj).reduce((total, value) => { return total + (value ?? 0); }, 0); };
额外说明
如果你坚持想用原有的写法,也可以用类型断言,但这种方式不够安全(如果后续逻辑有变化可能引入bug),不推荐:
total = total + (feeObj[property] as number);
内容的提问来源于stack exchange,提问作者Thành Nhân
相关产品推荐
相关产品推荐

