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
相关产品推荐
相关产品推荐

