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

使用React Query时遇‘类型“Error”无该属性’TypeScript错误

问题

在React Query的useMutation钩子执行失败时,尝试显示错误信息,但获取到的error类型为unknown。

mutation代码:

const {
    mutate: mutateRegister,
    error: errorRegister,
    isError: isErrorRegister,
    isSuccess: isSuccessRegister,
    data: dataRegister,
  } = useMutation(register, {
    onSuccess(d, v, c) {
      console.log(d);
      console.log(v);
      console.log(c);
    },
  });

尝试访问错误信息时,出现「属性不存在于类型Error」的错误,相关代码:

{isErrorType(errorRegister) ? <p>{errorRegister.response?.data}</p> : null}

当前的类型守卫函数:

export function isErrorType(error: unknown): error is Error {
    return error instanceof Error;
}

需要解决这个类型报错问题。

解决方案

你的类型守卫只判断了error是原生Error类型,但React Query抛出的错误通常是请求库(比如Axios)返回的自定义错误对象,这类错误会包含response等额外属性,而原生Error并没有这些属性,所以TypeScript会报错。

可以按以下步骤调整:

1. 定义自定义错误类型接口

根据你使用的请求库,定义包含额外属性的错误类型,比如适配Axios的错误结构:

// 可根据后端返回的错误结构,调整data里的字段
interface RequestError extends Error {
  response?: {
    data: {
      message: string;
      code?: number;
    };
  };
}

2. 更新类型守卫函数

让类型守卫不仅判断是Error实例,还要验证是否包含所需的属性:

export function isErrorType(error: unknown): error is RequestError {
  return (
    error instanceof Error &&
    typeof (error as RequestError).response !== 'undefined'
  );
}

如果不确定错误结构,也可以用宽松的方式兼容:

export function isErrorType(error: unknown): error is Error & { response?: { data?: unknown } } {
  return error instanceof Error;
}

3. 安全访问错误属性

修改渲染代码,确保属性访问的类型安全:

{isErrorType(errorRegister) ? <p>{errorRegister.response?.data?.message || '请求失败'}</p> : null}

4. 利用React Query泛型强化类型(可选)

在useMutation中通过泛型明确指定成功返回值、错误、参数的类型,进一步提升类型安全性:

// 先定义对应的类型
type RegisterResponse = { /* 请求成功的返回结构 */ };
type RegisterParams = { /* 传给register函数的参数结构 */ };

const {
  mutate: mutateRegister,
  error: errorRegister,
  // ...其他状态
} = useMutation<RegisterResponse, RequestError, RegisterParams>(register, {
  onSuccess(d, v, c) {
    console.log(d);
  },
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:06:32