TypeScript中Map实现getOrDefault后类型含undefined问题求助
解决TS中Map类似getOrDefault并确保返回类型非undefined的问题
问题原因
TS的类型系统没办法自动推断resultMap.set(index, new Set<number>()).get(index)一定返回Set<number>——虽然你的代码逻辑上是连续执行的,set之后立刻get肯定能拿到值,但Map的get方法类型定义本身就是get(key: K): V | undefined,TS不会追踪这种连续调用的状态变化,所以依然会认为可能返回undefined。
解决方案
方案1:显式判断并赋值(最直观)
通过先获取值,判断不存在时创建新值并存入Map,TS能正确推断变量类型:
const resultMap = new Map<number, Set<number>>(); const index = 0; let a = resultMap.get(index); if (!a) { a = new Set<number>(); resultMap.set(index, a); } // 此时a的类型明确为Set<number>
方案2:封装工具函数(复用性强)
把这个逻辑封装成通用函数,一次定义多次使用,类型也能严格保证:
function getOrSet<K, V>(map: Map<K, V>, key: K, defaultValue: () => V): V { let value = map.get(key); if (!value) { value = defaultValue(); map.set(key, value); } return value; } // 使用示例 const resultMap = new Map<number, Set<number>>(); const index = 0; const a = getOrSet(resultMap, index, () => new Set<number>()); // a的类型为Set<number>
方案3:类型断言(不推荐,仅临时应急)
如果不想改逻辑,可通过类型断言强制告诉TS返回值的类型,但这种方式跳过了TS的类型检查,若后续逻辑出错可能导致运行时问题:
const resultMap = new Map<number, Set<number>>(); const index = 0; const a = resultMap.get(index) ?? resultMap.set(index, new Set<number>()).get(index) as Set<number>;
内容的提问来源于stack exchange,提问作者Xinjian Yao
相关产品推荐
相关产品推荐

