如何根据字符串值判断泛型Map是否存在对应key并解决类型报错
报错原因
- 第一:你错误使用
Object.entries()遍历Map实例。Object.entries()是用于普通JS对象的方法,传入Map实例时会把Map当做普通对象枚举其自身可枚举属性,得到的key固定为字符串类型,和你声明的泛型K的类型不匹配。 - 第二:泛型K没有添加类型约束,TS无法确认K一定是string/number类型,无法兼容你后续的类型判断逻辑。
修复方案
- 给泛型K添加类型约束,限制为
string | number,符合你的业务要求 - 直接遍历
itemsMapper本身(Map实现了可迭代接口),不要用Object.entries包装,这样拿到的key类型就是泛型K的类型 - 调整key匹配distinctIdsList的逻辑,兼容number和string两种类型的K
修正后代码
export class SomeService { // 给K添加类型约束 getItemsPerKey<K extends string | number, V>(itemsMapper : Map<K,V[]>, distinctIdsList : number[]) { let filteredItemsMapper : Map<K, V[]> = new Map(); // 直接遍历Map,不要用Object.entries for (let [key, itemsTypeV] of itemsMapper) { // 兼容number/string类型的key,转成数字后判断是否在目标列表中 if (distinctIdsList.includes(Number(key))) { // 此时key的类型是K,不会再触发类型报错 if (filteredItemsMapper.has(key)) { // 你的原有逻辑 } } } } }
内容的提问来源于stack exchange,提问作者Guy E
相关产品推荐
相关产品推荐

