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

React Query(乐观更新)中使用onMutate时出现类型错误的解决咨询

解决React Query useMutation调用mutateAsync时onMutate类型错误的问题

嘿,我来帮你搞定这个类型错误的问题!

问题根源

你遇到的TS报错,本质是对React Query中onMutate钩子的使用位置理解错了——onMutate是属于useMutation初始化时的配置项,而不是调用mutateAsync时传入的参数。看一下你自定义的Hook,你没有在useMutation的配置里预留这个钩子的位置,而且MutateOptions(也就是mutateAsync的第二个参数类型)本身就不包含onMutate属性,所以TS直接拦下来了。

两种可行的解决办法

办法1:让自定义Hook支持传入配置项

如果你希望每个使用usePostApi的组件都能自定义onMutate这类生命周期钩子,可以修改你的Hook,让它接收可选的配置参数:

import { useMutation, MutateOptions } from '@tanstack/react-query';

// 先明确类型,让TS更友好
type PostResponse = ResponseData; // 替换成你实际的响应数据类型
type PostParams = FormData;

export const usePostApi = (options?: Omit<MutateOptions<PostResponse, unknown, PostParams>, 'mutationFn' | 'mutationKey'>) => {
  return useMutation(
    ['key'],
    (data: PostParams) => api.postFilesImages({ requestBody: data }),
    options // 把外部传入的配置传给useMutation
  );
};

然后在组件里,把onMutate放在Hook的初始化参数里:

const { mutateAsync } = usePostApi({
  onMutate: () => {
    // 这里写你的onMutate逻辑,比如乐观更新的缓存操作
  }
});

const { data } = await mutateAsync(formData);

办法2:直接在调用前执行前置逻辑(如果不需要回滚能力)

如果你只是想在这次特定的请求前执行一些代码,不需要利用onMutate和onError配合的回滚机制,那完全可以直接在调用mutateAsync之前执行逻辑:

// 先执行你原本要放在onMutate里的代码
const doPreMutateStuff = () => {
  console.log('准备发起请求了');
  // 比如更新本地状态、临时缓存数据等
};

doPreMutateStuff();
const { data } = await mutateAsync(formData);

补充说明

React Query的类型定义里,UseMutationOptions(useMutation的第三个参数类型)包含onMutate,而MutateOptions(mutate/mutateAsync的参数类型)只包含onSuccess、onError、onSettled这些,这就是为什么你传onMutate会触发类型错误的核心原因。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:12:38