"한 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 우수. 대부분 호출에 절대 <T> 명시 안 써 — compiler 가 argument 에서 알아내. 예외: inference 할 argument 없을 때 (return 만 하는 generic 호출 같은), 또는 inference 가 너의 취향에 너무 넓은 타입 고를 때.
// 추론:
const lengths = map([1, 2, 3], (n) => n.toString().length); // U 가 number 로 추론
// 명시 (드물게):
const empty = identity<string>(/* arg 필요 */);
unknown 필요할 수. Generic 빼고 관계 여전히 유지되는지 테스트.