如何解决TS报错:telemetryData.get(cid)处提示object is possibly undefined
问题原因
TypeScript 无法跟踪多次调用 telemetryData.get(cid) 的返回值关联性,哪怕你前置做了 has(cid) 判断和非 undefined 校验,类型收窄规则也不会跨独立的函数调用生效,所以每次调用 get 方法时 TS 都会判定返回值有可能为 undefined,因此抛出对应错误。
解决方法
方法1:提前取值缓存(最推荐)
仅调用一次 get 方法把对应值存入本地变量,再对这个变量做类型校验,TS 就能正常完成类型收窄:
const updateLoadedCount = mutatorAction('updateLoadedCount', (cid: string) => { const telemetryData = getTelemetryStore()?.telemetryData; if (telemetryData?.has(cid)) { const currentData = telemetryData.get(cid); if (currentData !== undefined) { currentData.imageLoaded = currentData.imageLoaded + 1; } } })
这种写法可读性和可维护性最高,不会埋下类型安全隐患。
方法2:非空断言快速修复(适合临时改码场景)
如果你确定当前逻辑下 get(cid) 绝对不会返回 undefined,可以手动加非空断言 ! 跳过 TS 的类型检查:
const updateLoadedCount = mutatorAction('updateLoadedCount', (cid: string) => { const telemetryData = getTelemetryStore()?.telemetryData; if (telemetryData?.has(cid)) { if (telemetryData.get(cid) !== undefined) { telemetryData.get(cid)!.imageLoaded = telemetryData.get(cid)!.imageLoaded + 1; } } })
该方案改动最小,但后续逻辑变更时容易忽略此处的断言埋下隐患,不推荐长期使用。
方法3:可选链+空值合并兜底
如果需要兼容异常场景,也可以用可选链加空值合并运算符给默认值兜底:
const updateLoadedCount = mutatorAction('updateLoadedCount', (cid: string) => { const telemetryData = getTelemetryStore()?.telemetryData; if (telemetryData?.has(cid)) { const target = telemetryData.get(cid); target && (target.imageLoaded = (target.imageLoaded ?? 0) + 1); } })
内容的提问来源于stack exchange,提问作者flyingbee
相关产品推荐
相关产品推荐

