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

React Query 结合 TypeScript 如何正确为 mutation 结果定义类型

问题根源

你当前的类型定义和实际运行返回值不匹配:axios.post方法默认返回的是封装后的AxiosResponse类型对象,接口返回的真实User数据存储在该对象的data属性下,你直接将client.post的返回值声明为Promise<User>属于类型谎报,才会导致静态类型提示和运行时结果不一致。

解决方案

方案一(更推荐):请求方法直接返回业务数据

在请求方法中提前取出响应体里的业务数据,让返回值和声明的类型完全匹配:

import type { AxiosResponse } from 'axios';

export function postInviteTeamMember(payload: InviteMutationVars): Promise<User> {
  // 拿到axios响应后直接返回内部的data字段
  return client.post('/user/invite/team', payload)
    .then((response: AxiosResponse<User>) => response.data);
}

修改后你的自定义hook不需要做任何改动,onSuccess回调的data参数静态类型和运行时的值都会是User类型。

方案二:保留完整axios响应对象

如果你需要在业务层用到完整的响应状态、头部等信息,可以调整类型定义匹配实际返回值:

  1. 先修正请求方法的返回类型定义:
import type { AxiosResponse } from 'axios';

export function postInviteTeamMember(payload: InviteMutationVars): Promise<AxiosResponse<User>> {
  return client.post('/user/invite/team', payload);
}
  1. 再调整自定义hook的泛型参数:
function useInviteTeamMember(
  onSuccess?: Handler,
  onError?: Handler,
): UseMutationResult<AxiosResponse<User>> {
  const mutation = useMutation(
    (payload: InviteMutationVars) => postInviteTeamMember(payload),
    {
      onSuccess: (response) => {
        // 此时response.data 就是User类型,和运行时一致
        const user = response.data;
        // 后续业务逻辑
      }
    }
  )
  // ...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:15:02