인프런 커뮤니티 질문&답변

신동마님의 프로필 이미지
신동마

작성한 질문수

[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편

void의 두 가지 사용법

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

작성

·

321

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

안녕하세요
함수 자체의 반환 타입 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 하면 에러가 안 납니다. 이 부분 강의에서도 제가 설명하지 않았나요?

신동마님의 프로필 이미지
신동마
질문자

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

신동마님의 프로필 이미지
신동마

작성한 질문수

질문하기