You need to enable JavaScript to run this app. Typescript结合axios调用API时自定义嵌套类型未生效触发Unsafe报错咨询
优惠活动
大模型
产品
解决方案
定价
更多

Typescript结合axios调用API时自定义嵌套类型未生效触发Unsafe报错咨询

报错核心原因

1. 自定义类型未与axios请求返回值建立关联

  • axios的请求方法本身支持传入泛型参数声明响应类型,如果你调用axios(config)时没有显式传入泛型,它会默认把返回的响应对象推导为AxiosResponse<any>,即整个响应的所有字段都是any类型。
  • 你虽然定义了Response接口,但没有把它作为泛型参数传递给axios请求方法,这份类型定义完全没有参与实际返回值的类型推导,自然无法起到校验作用。此时response本身就是any类型,访问response.data时,TS就会抛出Unsafe member access .data on an any value错误。

2. 函数返回值标注与实际返回内容不匹配

  • 你给getSource函数标注的返回Promise类型为Promise<AxiosResponse<Response>>,意味着函数需要返回完整的axios响应对象(包含status、headers、config等axios内置属性)。
  • 但你在try块中实际返回的是response.data.data[0],也就是嵌套结构最内层的单个Source对象。由于前面的response本身是any类型,这个返回值自然也是any,进一步触发Unsafe return on an any typed value错误。

修正实现

调整核心逻辑:

  • 调用axios请求时显式传入响应体的类型泛型,让TS能正确推导完整响应的类型结构
  • 修正函数的返回值标注,匹配实际要返回的内容(单个Source对象,而非完整axios响应)
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';

export interface Source {
  curr: string;
  uuid: string;
  rate: string;
}

// 直接定义后端返回的实际业务响应体结构
interface ApiResponseData {
  data: Source[];
}

async function getSource(params: Source): Promise<Source> {
  const requestConfig: AxiosRequestConfig = {
    method: 'get',
    url: '/url',
  };

  try {
    // 给axios传入响应体泛型,此时完整响应的结构会被TS严格校验
    const response: AxiosResponse<ApiResponseData> = await axios.request<ApiResponseData>(requestConfig);
    // 以下访问全链路都有类型约束,不会触发any相关的安全报错
    return response.data.data[0];
  } catch (err) {
    throw new Error('error');
  }
}

注意:你之前定义的Response接口容易和axios内置的AxiosResponse结构混淆——AxiosResponse本身已经自带一层data属性用来承载后端返回的响应体,将接口业务结构和axios的内置响应结构叠加时,很容易出现类型层级的认知偏差。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 23:45:06