kanfutrooper
@kanfutrooper (masaomi)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

『Expected 1 arguments, but got 2.』を解決したい

『Expected 1 arguments, but got 2.』 を解決したい

下記の箇所に、titleとcontentを加えたら、上記のエラーが表示される。
エラー文を検索したら、『引数は1つしか渡せないのに、2つ渡してしまっているエラー』と判明。
createTodo に渡す引数を見直すまではわかったが、汎用的な内容しか記載してなくて、解決策がわからなかった。

title, content を両立する方法を知りたいです。
何方かアドバイスをお願いします。

const { title, content } = data;
dispatch(createTodo(title, content));

発生している問題・エラー

TS2554: Expected 1 arguments, but got 2.
    20 |   const onSubmit = (data: { title: string; content: string }) => {
    21 |     const { title, content } = data;
  > 22 |     dispatch(createTodo(title, content));
       |                                ^^^^^^^
    23 |     reset();
    24 |   };
    25 |   return (
AddTodo.tsx
import { useForm } from 'react-hook-form';
import {
  Box,
  Button,
  FormControl,
  FormErrorMessage,
  Input,
} from '@chakra-ui/react';
import { useAppDispatch } from '../../stores/hooks';
import { createTodo } from '../../stores/slices/todoSlice';

type Todo = {
  title: string;
  content: string;
};

const AddTodo: React.FC = () => {
  const dispatch = useAppDispatch();
  const {
    handleSubmit,
    register,
    formState: { errors, isSubmitting },
    reset,
  } = useForm();
  const onSubmit = (data: { title: string; content: string }) => {
    const { title, content } = data;
    dispatch(createTodo(title, content));
    reset();
  };
  return (
    <Box display='flex' justifyContent='center'>
      <form onSubmit={handleSubmit(onSubmit)}>
        <FormControl
          isInvalid={errors.title}
          w={{ base: '90vw', sm: '80vw', md: '70vw', lg: '60vw' }}
        >
          <Input
            id='title'
            placeholder='Enter Title'
            {...register('title', { required: 'Please enter title.' })}
          />
          {/* <Input
            id='content'
            placeholder='Enter Content'
            {...register('content', { required: 'Please enter content.' })}
          /> */}
          <FormErrorMessage>
            {errors.title && errors.title.message}
          </FormErrorMessage>
        </FormControl>
        <FormControl
          isInvalid={errors.content}
          w={{ base: '90vw', sm: '80vw', md: '70vw', lg: '60vw' }}
        >
          {/* <Input
            id='title'
            placeholder='Enter Title'
            {...register('title', { required: 'Please enter title.' })}
          /> */}
          <Input
            id='content'
            placeholder='Enter Content'
            {...register('content', { required: 'Please enter content.' })}
          />
          <FormErrorMessage>
            {errors.content && errors.content.message}
          </FormErrorMessage>
        </FormControl>
        <Box w='100%' display='flex' justifyContent='flex-end'>
          <Button
            mt={4}
            colorScheme='whatsapp'
            isLoading={isSubmitting}
            type='submit'
            variant='outline'
          >
            Submit
          </Button>
        </Box>
      </form>
    </Box>
  );
};

export default AddTodo;
0

2Answer

すでに回答されていますが、同意見です。
現状createTodoが1変数関数として定義されていると思われます。なので、createTodoを2変数関数として書く必要があると考えられます。
あるいは、せっかくonSubmit関数の引数dataがタイトルと内容を持つオブジェクトになっているので、やはりcreateTodo関数の仕様変更は行うことになると思われますが、

  const onSubmit = (data: { title: string; content: string }) => {
    dispatch(createTodo(data));
    reset();
  };

として、createTodo関数内でtitlecontentを分離して処理を行うこともできそうです。

3Like

Comments

  1. @kanfutrooper

    Questioner

    @daisei-yoshinoさん、丁寧な解説付き及びソースコードのアドバイスありがとうございます!

Comments

  1. @kanfutrooper

    Questioner

    アドバイス、ありがとうございます!
    上記の方の説明で、エラーを含めて、解決することができました!

Your answer might help someone💌