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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:50:08