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

TypeScript解析API JSON响应遇undefined问题,求高效解析方案

TypeScript解析API JSON响应问题解决

问题根源

你读取phoneNumber得到undefined的核心原因是接口定义与实际JSON结构不匹配:

  • 原接口中custdetails的address被定义为数组Address[],但实际返回的JSON里每个用户的address是单个对象,并非数组。这种类型不匹配会导致TypeScript类型校验异常,进而影响属性读取。
  • 同时原始for循环写法可以进一步优化,提升代码简洁度和可读性。

修正后的接口定义

按照实际JSON结构调整接口,同时遵循TypeScript大驼峰命名规范:

export interface Address {
    streetAddress: string;
    city: string;
}

export interface PhoneNumber {
    type: string;
    number: string;
}

// 接口名首字母大写,address改为单个对象类型
export interface CustDetails {
    name: string;
    age: number;
    address: Address;
    phoneNumber: PhoneNumber[];
}

高效解析方法

1. 提取每个用户的电话号码数组(保留用户维度)

用Array.map()替代原始for循环,简洁高效:

// 假设apiResponse是从接口获取的JSON数据,先断言为正确类型
const custList: CustDetails[] = apiResponse as CustDetails[];

// 提取每个用户的电话号码数组
const phnNumbers = custList.map(cust => cust.phoneNumber);

2. 提取所有电话号码(扁平化合并)

如果需要把所有用户的电话号码合并成一个数组,使用Array.flatMap():

// 合并所有电话号码对象
const allPhoneNumbers = custList.flatMap(cust => cust.phoneNumber);

// 若只需要号码字符串,可进一步处理
const allPhoneNumberStrings = custList.flatMap(cust => 
  cust.phoneNumber.map(phone => phone.number)
);

3. 带类型安全的完整请求示例

结合fetch请求,确保端到端类型安全:

async function fetchCustomerData(): Promise<CustDetails[]> {
  const response = await fetch('你的API地址');
  const data = await response.json();
  
  // 可选:简单校验后端返回数据结构,避免异常
  if (!Array.isArray(data) || !data.every(item => item?.phoneNumber)) {
    throw new Error('API返回数据格式不符合预期');
  }
  
  return data as CustDetails[];
}

// 使用示例
fetchCustomerData().then(custList => {
  const phoneNumbers = custList.map(cust => cust.phoneNumber);
  console.log(phoneNumbers);
});

内容的提问来源于stack exchange,提问作者Devops_Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:51:12