TypeScript React项目中Axios响应类型被强制添加any类型的原因及解决方法
问题解析与解决方法
为什么会出现, any类型?
你看到的AxiosResponse<CartItemType[], any>里的第二个any,其实是Axios内置类型AxiosResponse的第二个泛型参数,它的官方类型定义是这样的:
interface AxiosResponse<T = any, D = any> { data: T; status: number; statusText: string; headers: AxiosResponseHeaders; config: AxiosRequestConfig<D>; request?: any; }
第二个泛型D代表请求发送的数据类型(比如POST请求里你传给后端的body类型),默认值是any。你调用axios.get<CartItemType[]>时只指定了第一个泛型参数(响应数据的类型),所以第二个参数就沿用了默认的any——这并不是你的自定义类型被混入了any,只是Axios类型定义的默认行为,本身不是报错的核心原因。
代码报错的真正根源
报错的核心问题是:你把整个AxiosResponse对象传给了setData,但setData需要的是CartItemType[]类型的纯数据数组。Axios的get方法返回的响应对象里,真正的后端返回数据是存在response.data属性里的,你直接把包含status、headers等额外信息的整个响应对象传给setData,类型自然不匹配。
修复方法
只需要修改then回调里的代码,取出响应对象的data属性即可:
const App = () => { const [data, setData] = useState<CartItemType[]>([]); const [loading, setLoading] = useState(true); useEffect(() => { axios.get<CartItemType[]>("https://fakestoreapi.com/products") .then(response => { // 取出response.data,这才是真正的产品数组 setData(response.data); setLoading(false); }) }, []) }
如果想要显式消除那个默认的any(虽然对于GET请求来说必要性不高),也可以手动指定第二个泛型参数:
// GET请求没有请求体,所以第二个泛型可以设为void axios.get<CartItemType[], void>("https://fakestoreapi.com/products")
内容的提问来源于stack exchange,提问作者ms3300




