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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:30:08