如何在TypeScript中遍历未知结构对象并移除//@ts-ignore?
解决方案
核心思路
object类型不允许用字符串索引,我们可以给数据指定Record<string, unknown>类型——它表示“键为字符串、值为未知类型”的对象,既满足TypeScript的类型检查规则,又比any更安全(unknown需要显式类型断言才能使用,避免随意操作值引发隐式错误)。
方案1:显式类型断言+键遍历
// 将data断言为字符串索引的未知值对象 const typedData = data as Record<string, unknown>; const phoneNumbers = Object.keys(typedData) // 过滤包含phoneNumbers的键,且对应值不为空 .filter(key => key.includes("phoneNumbers") && typedData[key] != null) // 映射为目标结构,断言值为字符串(根据CSV解析结果确定类型) .map(key => ({ number: typedData[key] as string, type: PHONE_TYPES.OFFICE }));
方案2:用Object.entries简化遍历
直接遍历键值对,省去单独处理索引的步骤:
const phoneNumbers = Object.entries(data as Record<string, unknown>) // 过滤键包含phoneNumbers的项 .filter(([key]) => key.includes("phoneNumbers")) // 映射为目标结构 .map(([_, value]) => ({ number: value as string, type: PHONE_TYPES.OFFICE }));
方案3:类型守卫提升类型安全性
如果需要确保提取的值一定是字符串,可以添加类型守卫:
// 定义类型守卫,判断值是否为字符串 function isString(value: unknown): value is string { return typeof value === 'string'; } const typedData = data as Record<string, unknown>; const phoneNumbers = Object.keys(typedData) // 过滤时同时验证值的类型 .filter(key => key.includes("phoneNumbers") && isString(typedData[key])) // 此处value已被类型守卫推断为string,无需额外断言 .map(key => ({ number: typedData[key], type: PHONE_TYPES.OFFICE }));
为什么不用any?
any会完全关闭TypeScript的类型检查,可能导致后续代码出现隐式错误;而unknown要求必须显式处理类型,既满足当前未知结构的需求,又能在后续操作中保证类型安全。
内容的提问来源于stack exchange,提问作者Murilo Schünke
相关产品推荐
相关产品推荐

