inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

한 입 크기로 잘라먹는 타입스크립트(TypeScript)

상태관리와 Props 2

이 호출과 일치하는 오버뢰드가 없습니다. 0개의 인수가 필요한데 1개를 가져왔습니다. 오류가 뜨네요

해결된 질문

237

Park Ju Yeong

작성한 질문수 5

0

image.png

위와같이 빨간색 줄이 발생하고있습니다.

화면은 정상출력되구요.

설정문제일까요?

 

에러 상세

이 호출과 일치하는 오버로드가 없습니다.
오버로드 1/5('(reducer: ReducerWithoutAction<any>, initializerArg: any, initializer?: undefined): [any, DispatchWithoutAction]')에서 다음 오류가 발생했습니다.
'(state: Todo[], action: Action) => ({ in: number; content: string; } | Todo)[]' 형식의 인수는 'ReducerWithoutAction<any>' 형식의 매개 변수에 할당될 수 없습니다.
대상 서명이 너무 적은 인수를 제공합니다. 2 이상이 필요하지만 1을(를) 받았습니다.
오버로드 2/5('(reducer: (state: Todo[], action: Action) => ({ in: number; content: string; } | Todo)[], initialState: never, initializer?: undefined): [never, Dispatch<Action>]')에서 다음 오류가 발생했습니다.
'never[]' 형식의 인수는 'never' 형식의 매개 변수에 할당될 수 없습니다.ts(2769)

 

0개의 인수가 필요한데 1개를 가져왔습니다.ts(2554)

(property) data: {
id: number;
content: string;
}

<소스>

import { useEffect, useReducer, useRef, useState } from "react";
import "./App.css";
import Editor from "./components/Editopr";
import { Todo } from "./types";
import Todoitem from "./components/TodoItem";

type Action =
  | {
      type: "CREATE";
      data: { in: number; content: string };
    }
  | { type: "DELETE"; id: number };

function reducer(state: Todo[], action: Action) {
  switch (action.type) {
    case "CREATE":
      return [...state, action.data];
    case "DELETE":
      return state.filter((todo) => todo.id !== action.id);
  }
}

function App() {
  const [todos, dispatch] = useReducer(reducer, []);
  const idRef = useRef(0);

  const onClickAdd = (text: string) => {
    dispatch({ type: "CREATE", data: { id: idRef.current++, content: text } });
  };

  const onClickDelete = (id: number) => {
    dispatch({ type: "DELETE", id: id });
  };

  useEffect(() => {
    console.log(todos);
  }, [todos]);

  return (
    <>
      <h1>Todo</h1>
      <Editor onClickAdd={onClickAdd}>
        <div>child</div>
      </Editor>
      <div>
        {todos.map((todo) => (
          <Todoitem key={todo.id} {...todo} onClickDelete={onClickDelete} />
        ))}
      </div>
    </>
  );
}

export default App;

typescript

답변 2

1

이정환 Winterlood

안녕하세요 이정환입니다.

우선 코드에 오타가 있네요 Action 타입을 정의하는 부분에서 id를 in으로 잘못 작성하신것 같습니다.

image.png

해당 오타로 인해 타입 추론이 정상적으로 이루어지지 않은걸로 보여요!

오타 수정하시면 문제 없이 동작할 것 같습니다. 그래도 안되면 답글 주세요

1

Park Ju Yeong

와. 답변 정말 빨리 달아주시네요!

수정 후 에러 사라지는 것 확인하였습니다.

타입스크립트의 타입이 어떻게 연결되는지 에러로 더

잘 알수있었습니다.

 

0

이정환 Winterlood

앗 ㅋㅋㅋ 다행이네요! 감사합니다 😃

 

1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

Park YongCheon님이 제기하신 오류 메시지는 useReducer 함수의 사용과 관련된 문제로 보입니다. useReducer는 두 개의 필수 매개변수를 필요로 합니다: 리듀서 함수와 초기 상태입니다. 그런데, 오류 메시지를 보면 호출 시에 인수의 타입이나 개수가 일치하지 않아서 문제가 발생한 것으로 보입니다.

문제의 원인

코드를 살펴보면 Action 타입 정의에서 data property에 있는 ‘id’의 타입이 맞지 않는 부분이 발견됩니다. 이는 타입스크립트에서 타입 불일치로 해석하여 오류를 발생시키고 있습니다. CREATE 액션의 data에 있는 ‘id’의 잘못된 표현으로 인해 reducer 함수 내에서의 동작이 올바르게 작동하지 않을 수 있습니다.

해결 방법

  1. Action 타입 정의에서 CREATE 액션의 data 타입을 아래와 같이 수정해야 합니다:

    type Action =
     | {
         type: "CREATE";
         data: { id: number; content: string };  // 'in' 대신 'id'로 수정
       }
     | { type: "DELETE"; id: number };
    
  2. 이 수정 이후, useReducer에서 초기 상태를 올바르게 전달하는지 확인해야 합니다:

    const [todos, dispatch] = useReducer(reducer, []);
    

추가 참고사항

만약 위의 수정으로도 문제가 해결되지 않으면, useReducer의 초기 상태 및 Action의 타입이 다른 부분에서 에러를 유발할 수 있습니다. 따라서, 전체적인 상태 관리를 다시 한번 확인해 보시는 것을 추천드립니다.

유사한 해결 방법 링크

비슷한 문제를 겪으신 분의 질문과 답변을 열람하실 수 있는 링크를 제공드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

Park Ju Yeong

아 , 오타 하나가 타입을 못 찾게 만들었군요.

타입스크립트를 사용하는 이유를 알게되네요.

답변 감사합니다.

적절한 타입 찾기 React.ChangeEvent<HTMLInputElemen>

0

29

2

outDir 옵션 추가 후 컴파일 오류 질문

0

63

1

호출 시그니처 질문

0

66

2

서로소 유니언 타입이 discriminated union과 동의어 인가요?

0

75

2

조건부타입소개 중 함수오버로딩 활용 시 인수의타입과 함수의 반환값의 타입이 깨지는 문제

0

67

1

할인쿠폰 관련하여

0

159

2

프론트엔드에서의 인터페이스활용

0

94

2

안녕하세요 이정환님!

0

91

1

Node.js 설치에 관한 질문입니다.

0

79

2

함수 타입 호출 시그니처

0

58

1

35강. 모듈 보강은 라이브러리 파일을 직접 편집해야 하나요?

0

64

2

인터페이스 문법이 있는데 타입 별칭 문법은 왜 있나요?

0

118

4

마우스 호버 시 정보

0

92

2

vite으로 리액트 빌드하기를 업데이트해주세요.

1

89

2

타입가드를 만들어 사용하는 이유가 궁금합니다.

0

83

2

섹션 12가 너무 어려운데... 정상이겠죠..?

0

137

2

선생님.. 알고리즘도 강의해주시면안되나요

0

100

2

선생님은 어떻게 이런걸 아세요?

0

128

1

type: module

0

97

2

7:17초 업캐스팅 질문이있습니다!

0

76

1

슈퍼타입질문

1

63

2

프로젝트 설치

0

104

2

enum은 비원시 타입이면서 열거형 타입이 되는건가요?

0

69

2

함수는 함수타입? 객체타입??

1

95

2