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

React Query v5 useMutation自定义钩子的TypeScript类型错误解决

React Query v5 useMutation 类型错误修复

我为实现关注点分离与复用,封装了基于React Query useMutation的自定义钩子。使用React Query v5.28.14时,TypeScript报错:

Type '(bookData: Shop) => Promise' has no properties in common with type 'UseMutationOptions<Shop, Error, Shop, unknown>'

原代码示例

useCustomMutation.ts

import apiClient from "@/services/api/api-client";
import { useMutation } from "@tanstack/react-query";

type Shop = {
  shopCode: string;
  shopName: string;
  mobileNo: string;
  address: string;
};

const createBook = async (bookData: Shop) => {
  const { data } = await apiClient.post("/books", bookData);
  return data;
};

export const useCreateBook = () => {
  return useMutation<Shop, Error, Shop, unknown>(createBook, {
    onSuccess: () => {
      // invalidate the query cache for 'shop'
    },
  });
};

ShopList.ts

const {mutate} = useCustoumMatation()

const onSubmit (data:Shop){
     mutate(data)
}

错误原因与修复方案

React Query v5 彻底修改了useMutation的API结构:不再支持将mutation函数作为第一个参数传入,必须把它放在配置对象的mutationFn字段中。同时注意钩子调用的拼写错误。

修正后的useCustomMutation.ts

import apiClient from "@/services/api/api-client";
import { useMutation } from "@tanstack/react-query";

type Shop = {
  shopCode: string;
  shopName: string;
  mobileNo: string;
  address: string;
};

const createBook = async (bookData: Shop) => {
  const { data } = await apiClient.post("/books", bookData);
  return data;
};

export const useCreateBook = () => {
  return useMutation({
    mutationFn: createBook,
    onSuccess: () => {
      // 这里可以添加缓存失效逻辑,比如:
      // queryClient.invalidateQueries({ queryKey: ['shops'] })
    },
  });
};

修正后的ShopList.ts

import { useCreateBook } from './useCustomMutation';
import type { Shop } from './useCustomMutation';

const { mutate } = useCreateBook();

const onSubmit = (data: Shop) => {
  mutate(data);
};

可选:显式指定类型

如果需要手动声明泛型类型(TypeScript通常能自动推导),可以这样写:

export const useCreateBook = () => {
  return useMutation<Shop, Error, Shop, unknown>({
    mutationFn: createBook,
    onSuccess: () => { /* ... */ },
  });
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:15:25