눈에 보이는 에러는 없는데 완벽하게 타이핑한 것일까요? 다시 한번 말하지만,
100% 정확하게 타이핑하는 것은 매우 어려운 일입니다.
적당히 쓸 만하게 타이핑하는 것이 중요합니다.
map과 forEach의 가장 큰 차이점은 반환값이 있다는 것입니다. 반환값의 타입은 배열 요소의 타입과 다를 수 있습니다. 그런데 변수 r1, r2, r3, r4의 타입은 모두 void입니다. 따라서 이 부분을 수정해야 합니다. 다음 코드를 보기 전에 직접 타이핑해보세요. 콜백 함수의 반환값과 map 메서드의 반환값이 서로 관련되어 있다는 것이 힌트입니다.
const r1 = [1, 2, 3].myMap(() => {});
// const r1: void[]
const r2 = [1, 2, 3].myMap((v, i, a) => v);
// const r2: number[]
const r3 = ['1', '2', '3'].myMap((v) => parseInt(v));
// const r3: number[]
const r4 = [{ num: 1 }, { num: 2 }, { num: 3 }].myMap(function(v) {
return v.num;
});
// const r4: number[]
interface Array<T> {
myMap<R>(callback: (v: T, i: number, a: T[]) => R): R[];
}