next.js 在useMutation(react-query)中获取Typescript错误

p5fdfcr1  于 5个月前  发布在  React
关注(0)|答案(2)|浏览(83)

我想创建订阅表单页面,我使用next jsreact-querytypescript。我无法在typescript中配置我的API请求。
我的表单组件

'use client';
import React, { FormEvent, useState } from 'react';

import { useEmailSubscription } from 'src/api/email-subscription/mutations';

const SubscribeForm = () => {
  const [email, setEmail] = useState('');
  const { mutate } = useEmailSubscription();

  const _onSubmit = (e: FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    mutate(email);
  };

  return (
    <form onSubmit={_onSubmit}>
      <div className="form-group">
        <label id="email">Stay tuned for an awesome experience!</label>
        <input
          type="email"
          id="email"
          onChange={(e) => setEmail(e.target.value)}
          placeholder="[email protected]"
        />
      </div>
      <button type="submit">Subscribe</button>
    </form>
  );
};

export default SubscribeForm;

字符串
我的第一个错误

mutate(email) // Argument of type 'string' is not assignable to parameter of type 'void'


我的要求

export const useEmailSubscription = () => {
  return useMutation((email: string) => axiosOpen.post('/email-subscriptions', { email }));
};


我的第二个错误

Type (email: string)=> Promise <AxiosResponse <any, any>> has no properties in common with type 'UseMutationOptions<unknown, Error, void, unknown'


我不知道该怎么补救?

m528fe3b

m528fe3b1#

第一个错误:mutate(email)

您的mutate函数需要一个void类型的参数,但您传递的是一个字符串(email)。这种差异可能是由于您如何定义您的突变。在您的useEmailSubscription钩子中,您需要正确输入突变函数。

第二个错误:类型与useMutation不匹配

您需要确保在useMutation中指定的类型与您传递的函数一致。
像这样修改你的mutation hook:

export const useEmailSubscription = () => {
  return useMutation<void, Error, string>((email) => axiosOpen.post('/email-subscriptions', { email }));
};

字符串
表单组件应该像现在这样工作,mutate函数正确地接受一个字符串参数

332nm8kg

332nm8kg2#

这个错误说你正在传递一个函数,其中应该有MutationOptions。我假设你正在使用React Query的v5,其中唯一可用的语法是将选项对象传递给useQueryuseMutation。所以你需要:

export const useEmailSubscription = () => {
  return useMutation({
    mutationFn: (email: string) => axiosOpen.post('/email-subscriptions', { email })
  })
};

字符串
调用mutate(email)是正确的,错误应该在那之后消失。

相关问题