You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动