반환값이 어떤 타입이 될지 미리 알 수가 없습니다. 그럴 때는 제네릭 타입 매개변수로 선언하면 됩니다. forEach 때와 마찬가지로 Array<T>에는 새로운 타입 매개변수를 선언할 수 없기에 myMap 메서드에 R 타입 매개변수를 선언했습니다.
자바스크립트에서 콜백 함수의 반환값이 number이면 map 메서드의 반환값도 number[]이고, 콜백 함수의 반환값이 string이면 map 메서드의 반환값도 string[]이 됩니다. 즉, 콜백 함수의 반환값이 R이면, map 메서드의 반환값은 R[]이 되는 것입니다.
이제 변수 r1, r2, r3, r4의 타입이 제대로 추론됩니다. 타입스크립트는 어떻게 R[]을 추론할 수 있을까요? 변수 r3의 경우를 봅시다. T는 string인데, parseInt(v)에서 숫자로 바뀝니다. 그래서 callback 매개변수의 반환값 R이 number로 추론됩니다. 따라서 R[]은 number[]가 됩니다.