C.W.K.
Stream
Lesson 02 of 07 · published

Generic 함수

~10 min · generics, functions, multiple-parameters

Level 0Curious
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
"한 signature, 모든 타입, 중복 없음."

단일 타입 parameter

가장 단순한 generic 함수가 한 타입 parameter 받고 input 과 output 관계 위해 써. function head<T>(arr: T[]): T | undefined — return 이 배열의 element (같은 타입 T) 또는 `undefined` (빈 배열). 입력 element 타입과 return 의 관계가 T 공유로 캡처.

여러 타입 parameter

실제 함수가 자주 둘 이상의 타입 관련. function map<T, U>(arr: T[], fn: (x: T) => U): U[] — 이렇게 읽어: T 의 배열 받고, T 에서 U 로 mapping 하는 함수 받고, U 의 배열 반환. 두 parameter 가 다른 타입일 수 있고, 관계가 callback 의 입력과 출력 사이.

관례: 추상일 땐 단일 대문자 (T, U, V), 역할이 가독성에 도움될 땐 의미 있는 이름 (TInput, TResult) 으로 타입 parameter 이름. 두 스타일 다 흔함; 하나 골라서 일관성 유지.

Call site 의 inference

Generic 함수에 대한 TypeScript inference 우수. 대부분 호출에 절대 `` 명시 안 써 — compiler 가 argument 에서 알아내. 예외: inference 할 argument 없을 때 (return 만 하는 generic 호출 같은), 또는 inference 가 너의 취향에 너무 넓은 타입 고를 때.

// 추론:
const lengths = map([1, 2, 3], (n) => n.toString().length);   // U 가 number 로 추론

// 명시 (드물게):
const empty = identity<string>(/* arg 필요 */);
최소 viable generic 함수: 한 타입 parameter, parameter 위치와 return 위치 둘 다에 사용. Parameter 가 두 번 안 나타나면, generic 필요 없을 수 — 그냥 `unknown` 필요할 수. Generic 빼고 관계 여전히 유지되는지 테스트.

Code

Generic 함수 — 하나 또는 여러 타입 parameter·typescript
// 한 타입 parameter — 입력과 출력의 관계.
function head<T>(arr: T[]): T | undefined {
  return arr[0];
}
const a = head([1, 2, 3]);          // a: number | undefined
const b = head(['hi']);              // b: string | undefined

// 두 타입 parameter — 입력과 callback 출력.
function map<T, U>(arr: T[], fn: (x: T) => U): U[] {
  return arr.map(fn);
}
const c = map([1, 2, 3], (n) => n.toString());  // c: string[]

// Argument 와 callback 함께에서 추론.
function findFirst<T>(arr: T[], predicate: (x: T) => boolean): T | undefined {
  for (const x of arr) if (predicate(x)) return x;
  return undefined;
}
const d = findFirst([{ id: 1 }, { id: 2 }], (u) => u.id === 1);  // d: { id: number } | undefined

External links

Exercise

두 배열에서 대응 element 쌍짓는 generic zip<T, U>(a: T[], b: U[]): [T, U][] 함수 써. 추론된 return type 써서 쌍 옳게 thread. zip([1, 2], ['a', 'b']) 시도하고 결과 타입이 [number, string][] 인지 확인.
Hint
return a.map((x, i) => [x, b[i]]). Return 타입 [T, U][] 가 쌍 구조 통해 thread, caller 가 정확히 어느 쪽이 어느 것인지 알아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.