1

给定以下代码:

const setFriendCode = (data: Params) => api({ data })
const [mutateSetFriendCode, state] = useMutation<Response, Params>(
  setFriendCode
)

'(data: Params) => Promise' 类型的参数不可分配给 'MutationFunction<Response, undefined>' 类型的参数。参数“数据”和“变量”的类型不兼容。类型“未定义”不可分配给类型“参数”.ts(2345)

为了避免我使用的编译错误。

const setFriendCode = (data?: Params) => api({ data })
const [mutateSetFriendCode, state] = useMutation<Response, Params>(
  setFriendCode
)

但我想根据需要提供“数据”。

怎么去掉上面的问号data

4

2 回答 2

6

看起来您正在尝试匹配此重载(4 个中的 2 个):

export declare function useMutation<
  TData = unknown, 
  TError = unknown, 
  TVariables = void, 
  TContext = unknown
>(
  mutationFn: MutationFunction<TData, TVariables>, 
  options?: UseMutationOptions<TData, TError, TVariables, TContext>
): UseMutationResult<TData, TError, TVariables, TContext>;

useMutation钩子有 4 个泛型类型参数。我认为您打算使用ParamsasTVariables但实际上是TError在将其放在useMutation<Response, Params>(). 这就是为什么你最终会在代表unknown的类型中得到一个。MutationFunctionTVariables

该函数的签名是:

export declare type MutationFunction<
  TData = unknown, 
  TVariables = unknown
> = (
  variables: TVariables
) => Promise<TData>;

您的问题中没有很多信息,所以我填写如下空白:

type Params = {
    something: string;
}

const api = async (args: {data: Params}): Promise<Response> => {
  return fetch('');
}

const setFriendCode = (data: Params) => api({ data })

您在这里基本上有两种可能的方法:

  1. 您可以在挂钩上设置泛型useMutation并包含一些值TError
const object = useMutation<Response, unknown, Params>(
  setFriendCode
)
  1. 您可以推断类型并确保您的参数具有强类型。有了我穿上的类型apisetFriendCode我得到了<Response, unknown, Params, unknown>
const object = useMutation(
  setFriendCode
)
于 2021-04-22T19:40:57.747 回答
-1

useMutation 不返回数组,而是返回一个包含多个要使用的值的对象,请检查以下代码:

const {
       data,
       error,
       isError,
       isIdle,
       isLoading,
       isPaused,
       isSuccess,
       mutate,
       mutateAsync,
       reset,
       status,
     } = useMutation(mutationFn, {
       mutationKey,
       onError,
       onMutate,
       onSettled,
       onSuccess,
       useErrorBoundary,
     })
     
于 2021-02-23T08:11:53.913 回答