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

