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

React Redux:Typescript环境下RTK Mutation无法读取error.data如何解决

解决方法

问题原因

RTK Query 默认的 error 是 FetchBaseQueryError | SerializedError 联合类型:

  • 只有接口实际返回HTTP错误状态码时生成的FetchBaseQueryError才会携带data字段,存储后端返回的响应体
  • 前端侧抛出的普通错误(比如网络中断、序列化失败)会生成SerializedError,没有data属性
    因此TS不允许直接访问error.data,避免触发运行时报错。

推荐方案:类型收窄(最安全)

先定义你的后端错误结构,再通过类型谓词做类型判断,TS会自动识别合法的错误类型:

import { FetchBaseQueryError, SerializedError } from '@reduxjs/toolkit/query/react';

// 定义后端返回的错误结构
interface BackendErrorRes {
  status: string;
  message: string;
}

// 扩展FetchBaseQueryError匹配你的响应结构
interface CustomError extends FetchBaseQueryError {
  data: BackendErrorRes;
}

// 类型谓词判断函数
const isCustomError = (err: FetchBaseQueryError | SerializedError | undefined): err is CustomError => {
  return !!err && 'data' in err && typeof (err as CustomError).data?.message === 'string';
}

在组件中使用时先做判断即可安全访问:

const [createCategory, {isLoading, error }] = useCreateCategoryMutation();

if (isCustomError(error)) {
  // 此处TS不会报错,可直接获取错误信息
  console.log(error.data.message);
}

临时方案:类型断言(不推荐)

如果只是临时调试,也可以直接做类型断言跳过类型检查,需要自行保证结构符合预期,否则会有运行时报错风险:

const errMsg = (error as FetchBaseQueryError)?.data?.message;

全局配置方案

如果所有接口的错误结构都是统一的,可以在创建RTK API时自定义baseQuery的错误类型,避免每个组件重复写判断逻辑:

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

// 复用上面定义的CustomError类型
export const api = createApi({
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  reducerPath: 'api',
  endpoints: (builder) => ({
    // 你的原有endpoint定义
  }),
}) as typeof api & {
  // 全局统一错误类型
  useCreateCategoryMutation: () => [Function, { isLoading: boolean, error?: CustomError }]
  // 其他endpoint也可以按这个格式扩展类型
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:45:04