map과 forEach 메서드는 배열의 각 요소에 콜백을 적용하는 대표적인 고차함수map: 반환값을 기반으로 새로운 배열 생성forEach: 반환값 없이 순회 목적으로 사용map의 경우 원본 배열과 다른 타입으로도 매핑 가능하므로 타입 변수를 2개 사용함const arr = [1, 2, 3];
const newArr = arr.map((it) => it * 2);
// 결과: [2, 4, 6]
function map(arr: unknown[], callback: (item: unknown) => unknown): unknown[] {
// ...
}
function map<T>(arr: T[], callback: (item: T) => T): T[] {
let result = [];
for (let i = 0; i < arr.length; i++) {
result.push(callback(arr[i]));
}
return result;
}
map([1, 2, 3], (it) => it * 2); // ✅ [2, 4, 6]
map([1, 2, 3], (it) => it.toString()); // ❌ 오류
number로 고정되므로, string 반환 시 타입 충돌function map<T, U>(arr: T[], callback: (item: T) => U): U[] {
let result: U[] = [];
for (let i = 0; i < arr.length; i++) {
result.push(callback(arr[i]));
}
return result;
}
map([1, 2, 3], (it) => it.toString()); // ✅ ["1", "2", "3"]
map(["a", "b", "c"], (it) => it.length); // ✅ [1, 1, 1]
T, 반환 타입 U 분리const arr2 = [1, 2, 3];
arr2.forEach((it) => console.log(it));
// 출력: 1, 2, 3
function forEach<T>(arr: T[], callback: (item: T) => void) {
for (let i = 0; i < arr.length; i++) {
callback(arr[i]);
}
}
void 반환 타입 지정map보다 간단하고 안전하게 동작forEach(["a", "b", "c"], (item) => {
console.log(item.toUpperCase());
});
| 함수명 | 특징 |
|---|---|
| map | 반환값 기반으로 새 배열 생성, U[] 반환 |
| forEach | 반환값 없음, 순회 목적, void 반환 |
제네릭을 활용하면 다양한 타입의 데이터에 대해
안정적인 타입 추론과 오류 방지가 가능해진다.