• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

forEach 콜백함수 리턴값 타입이 void인 이유?

23.11.15 02:45 작성 조회수 232

0

declare function forEach(arr: number[], callback: (el: number) => undefined): void;

let target: number[] = [];
forEach([1, 2, 3], el => { target.push(el) }); // 에러 void 형식은 undefined 형식에 할당할 수 없다.
forEach([1, 2, 3], el => target.push(el)); // 에러 number 형식은 undefined 형식에 할당할 수 없다

첫번째 forEach의 콜백함수 리턴값 타입이 왜 void인걸까요? return undefined가 생략되어 있으니, undefine라고 추론하지 않고 타입스크립트가 void라고 추론한 이유가 궁금합니다.. 챗 지피티에 물어보니 forEach 함수의 특성에 기인한다고 되있는데, 이게 맞는 정보인지 잘 모르겠습니다..

답변 1

답변을 작성해보세요.

2

jusssn님의 프로필

jusssn

2023.11.15

안녕하세요
함수 자체의 반환 타입 void는 "값을 반환 할수 없는 의미"의 undefined 와 같은 의미이고용,
콜백안에 void 의미는 "값을 반환할 수 있다"로 알고있고 그러기에 undefiend( 반환값이 없다) 의미는 아닌걸로 알고 있습니다

이둘의 차이가 있습니다 

그래서 콜백안에 리턴타입 값을 undefined -> void 로 바꿔주면 에러 안납니다,,

 

추가로 forEach 자체의 리턴값을 undefined로 해줘도 에러 안납니다, 왜냐면 실제 forEach 함수는 반환값이 없고 여기서의 void의미도 undefined 이기 때문입니다

declare function forEach(arr: number[], callback: (el: number) => void): undefined;

let target: number[] = [];
forEach([1, 2, 3], el => { target.push(el) }); 
forEach([1, 2, 3], el => target.push(el)); 

 

맞습니다. undefined -> void 하면 에러가 안 납니다. 이 부분 강의에서도 제가 설명하지 않았나요?

신동마님의 프로필

신동마

질문자

2023.11.15

타입스크립트가 콜백함수의 리턴값이 없으니 void라고 추론하는거군요? return undefined가 생략되서 왜 undefined라고 추론안하지? 라고 생각했어요.. 답변 감사합니다.