"한 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 우수. 대부분 호출에 절대 `
// 추론:
const lengths = map([1, 2, 3], (n) => n.toString().length); // U 가 number 로 추론
// 명시 (드물게):
const empty = identity<string>(/* arg 필요 */);