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

TypeScript访问联合类型对象中可能不存在的属性报错如何解决?

报错原因

你拿到的接口返回值是{data:string} | {error:unknown}联合类型,只有成功分支的对象存在data属性,错误分支不存在该属性,TypeScript 不允许直接访问联合类型上非共有的属性,因此抛出提示。

修复方案

  • 方案1:类型窄化判断(最推荐)
    无需修改原有axiosBaseQuery定义,仅需在使用返回值前做属性存在性判断,TypeScript会自动识别当前分支的类型:
const response = await yourApiCall();

if ("data" in response) {
  // 该分支下TS自动识别response为{data: string}类型,可正常访问data
  console.log(response.data);
} else {
  // 该分支下TS自动识别response为{error: unknown}类型,可正常访问error
  console.log(response.error);
}
  • 方案2:明确BaseQuery泛型类型
    你原有代码中BaseQueryFn的后两个泛型参数都填了unknown,导致返回类型推导模糊,可按业务实际的返回格式明确定义泛型:
// 先定义业务通用的错误返回结构
type BaseQueryErrorType = {
  status?: number;
  data?: unknown;
};

const axiosBaseQuery: BaseQueryFn<
  {
    url: string;
    method: "get" | "put" | "post" | "delete";
    data?: AxiosRequestConfig["data"];
  },
  string, // 第二个泛型为成功时返回的data类型,可按实际业务调整
  BaseQueryErrorType // 第三个泛型为错误时返回的error类型
> = async (args, api, extraOptions) => {
  try {
    const axiosInstance = initializeAxios(api.getState() as RootState);
    const result = await axiosInstance[args.method]("api/v0/" + args.url, args.data);
    return { data: result.data };
  } catch (axiosError) {
    const err = axiosError as AxiosError;
    return {
      error: { status: err.response?.status, data: err.response?.data }
    };
  }
};

修改后后续所有基于该baseQuery的接口返回值都会自动携带明确类型,配合方案1的窄化判断使用体验更好。

  • 方案3:类型断言(仅临时调试使用,不推荐)
    如果你确认当前场景接口一定会返回成功,可强制指定类型跳过TS校验:
const data = (response as { data: string }).data;

该方式会跳过类型校验,可能引入运行时异常,不建议在生产代码中长期使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:15:05