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

如何将MutationObserverOptions的类型参数转发给useMutation?

解决方案

要从MutationObserverOptions类型的对象中提取泛型参数并传递给useMutation,你可以借助TypeScript的**条件类型+类型推断(infer)**来实现,具体步骤如下:

1. 定义类型提取工具

先写一个工具类型,专门从MutationObserverOptions中拆解出它的四个泛型参数:

import { MutationObserverOptions } from '@tanstack/react-query';

// 从MutationObserverOptions中提取[TData, TError, TVariables, TContext]
type ExtractMutationParams<T extends MutationObserverOptions<any, any, any, any>> =
  T extends MutationObserverOptions<infer TData, infer TError, infer TVariables, infer TContext>
    ? [TData, TError, TVariables, TContext]
    : never;

2. 提取目标类型并使用

假设你已经定义好mutationOptions:

// 示例配置
const mutationOptions: MutationObserverOptions<TypeA, TypeB, TypeC, TypeD> = {
  mutationFn: (vars: TypeC) => {
    // 你的请求逻辑
    return Promise.resolve<TypeA>({});
  },
  // 其他配置...
};

// 从mutationOptions的类型中提取四个泛型参数
type MutationParams = ExtractMutationParams<typeof mutationOptions>;

// 传递给useMutation
const mutation = useMutation<
  MutationParams[0], // TData
  MutationParams[1], // TError
  MutationParams[2], // TVariables
  MutationParams[3]  // TContext
>(
  'myMutationKey',
  mutationOptions.mutationFn,
  mutationOptions
);

3. 更简洁的inline写法(无需工具类型)

如果不想单独定义工具类型,也可以直接在useMutation的泛型参数中使用推断:

const mutation = useMutation<
  typeof mutationOptions extends MutationObserverOptions<infer TData, any, any, any> ? TData : never,
  typeof mutationOptions extends MutationObserverOptions<any, infer TError, any, any> ? TError : never,
  typeof mutationOptions extends MutationObserverOptions<any, any, infer TVariables, any> ? TVariables : never,
  typeof mutationOptions extends MutationObserverOptions<any, any, any, infer TContext> ? TContext : never
>(
  'myMutationKey',
  mutationOptions.mutationFn,
  mutationOptions
);

为什么之前的写法不生效?

  • useMutation<typeof mutationOptions>错误是因为typeof mutationOptions是整个配置对象的类型,而useMutation需要的是四个独立的泛型参数(TData/TError/TVariables/TContext),不是一个对象类型。
  • Parameters<typeof mutationOptions>无效是因为Parameters工具类型仅用于提取函数的参数类型,而mutationOptions是一个对象,不是函数,所以完全不适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:15:44