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

Axios响应类型为any问题:data为何含any[]?如何改为AxiosResponse<Scenario[]>?

TypeScript类型疑问:data为何包含any[]?

以下是我整合自不同文件的代码:

import axios from "axios";
import { useQuery } from '@tanstack/react-query';

interface Scenario {
    id: number,
    name: string
}

const scenario = {
    getAll: () => axios.get<Scenario[]>(`/api/dyn/ax_scenario`)
}

const { 
    isLoading,
    isErrors, // 注意:react-query的正确字段是isError,不是isErrors
    data = []
} = useQuery({
    queryKey: ['api.scenario.getAll'],
    queryFn: api.scenario.getAll // 注意:你定义的是scenario对象,不是api.scenario,应该是scenario.getAll
});

当我悬停在data上时,TypeScript显示其类型为:

const data: any[] | AxiosResponse<Scenario[], any>

请问为何类型中会包含any[]?我希望响应类型仅为AxiosResponse<Scenario[]>。


原因分析

你给data设置了默认值= [],而TypeScript会把空数组[]自动推断为any[]类型。useQuery返回的data原本类型是AxiosResponse<Scenario[], any> | undefined,加上默认值后,TypeScript会将默认值类型与原类型做联合,最终得到any[] | AxiosResponse<Scenario[], any>。

解决方案

  1. 移除默认值:如果可以接受初始状态下data为undefined,直接删掉= [],此时data类型会是AxiosResponse<Scenario[], any> | undefined:
const { 
    isLoading,
    isError,
    data
} = useQuery({
    queryKey: ['api.scenario.getAll'],
    queryFn: scenario.getAll
});
  1. 指定默认值的正确类型:如果一定要保留默认值,需要构造一个符合AxiosResponse<Scenario[], any>类型的空响应对象作为默认值:
const emptyResponse: AxiosResponse<Scenario[], any> = {
    data: [],
    status: 200,
    statusText: 'OK',
    headers: {},
    config: {}
};

const { 
    isLoading,
    isError,
    data = emptyResponse
} = useQuery({
    queryKey: ['api.scenario.getAll'],
    queryFn: scenario.getAll
});

另外需修正代码里的两处错误:

  • react-query的错误状态字段是isError,不是isErrors
  • 你定义的API对象是scenario,不是api.scenario,所以queryFn应指向scenario.getAll

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:05:19