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

如何为UseMutationOptions第三个泛型传入元组类型?

React Query中多参数mutationFn的泛型类型指定

React Query的UseMutationOptions第三个泛型参数对应mutationFn的入参类型,但要注意**mutationFn本质上只能接受单个参数**。如果你想传递多个参数,有两种常见处理方式:

1. 元组类型方案(对应你的useTest2需求)

当你写mutationFn: (a: string, b: string[]) => testFn(a, b)时,TypeScript会把这两个参数解析为元组的解构,所以对应的泛型类型应该是元组[string, string[]]。修改后的useTest2代码如下:

const testFn = async (a: string, b: string[]) => { return 1 }

export const useTest2 = (
  options?: UseMutationOptions<number, Error, [string, string[]]>,
) =>
  useMutation({
    mutationFn: (a: string, b: string[]) => testFn(a, b),
    ...options,
  });

调用这个hook的mutate方法时,需要传入元组形式的参数:

const { mutate } = useTest2();
mutate(['testStr', ['arrItem1', 'arrItem2']]);

2. 对象类型方案(你的useTest实现)

这种方式是把多个参数包裹成一个对象,泛型指定为对应的对象类型,优点是参数语义更清晰,调用时不用记忆参数顺序:

type MutationFnParams = {
  a: string,
  b: string[]
}

export const useTest = (
  options?: UseMutationOptions<number, Error, MutationFnParams>,
) =>
  useMutation({
    mutationFn: ({ a, b }: MutationFnParams) => testFn(a, b),
    ...options,
  });

调用时传入对象:

const { mutate } = useTest();
mutate({ a: 'testStr', b: ['arrItem1', 'arrItem2'] });

补充说明

  • TypeScript具备自动类型推断能力,即使不手动指定UseMutationOptions的第三个泛型,它也能根据mutationFn的参数自动推导类型,但手动指定可以让代码更清晰,提前发现类型错误。
  • 两种方案都可行,选择哪种取决于团队代码风格和参数的语义清晰度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:12:44