작성
·
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));
타입스크립트가 콜백함수의 리턴값이 없으니 void라고 추론하는거군요? return undefined가 생략되서 왜 undefined라고 추론안하지? 라고 생각했어요.. 답변 감사합니다.
맞습니다. undefined -> void 하면 에러가 안 납니다. 이 부분 강의에서도 제가 설명하지 않았나요?