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
相关产品推荐
相关产品推荐

