"infer 가 pattern match 에서 타입 캡처. Compiler 가 모양 읽고 slot 묶음."
infer 가 뭐 함
infer 가 conditional 타입의 extends 절 안에서만 쓰이는 keyword. Match 되는 pattern 의 일부 캡처하는 타입 변수 선언. T extends Array<infer E> ? E : never 말함: "T 가 어떤 Array<E> 면, E 를 그 element 타입으로 설정; 아니면 never."
이게 타입-레벨 destructuring 버전. Pattern 쓰고, infer X 가 그 위치에 있던 거 캡처하는 binding.
Canonical 사용
배열의 element: type ElementOf<T> = T extends (infer E)[] ? E : never. 배열의 element 타입 추출.
함수의 return 타입: type ReturnOf<F> = F extends (...args: any[]) => infer R ? R : never. Standard library 의 ReturnType 이 정확히 이거.
Promise 된 타입: type Unwrap<T> = T extends Promise<infer V> ? V : T. Promise 에서 값 추출.
첫 argument: type FirstArg<F> = F extends (first: infer A, ...rest: any[]) => any ? A : never. 첫 parameter 타입 끄집어냄.
왜 infer 중요
infer 없으면, 타입의 모양 체크 가능 (T extends Array<unknown>) 하지만 새 정보 못 얻어. infer 가 conditional 타입을 yes/no 질문에서 변수 묶는 pattern match 로 바꿈. '배열이야?' 와 'element 타입 뭐야?' 의 차이.
이게 타입-레벨 프로그래밍의 관문. 다른 타입에서 타입 추출 가능하면, 합성 가능, 변환 가능, 정교한 derived 타입 빌드 가능 — 다 runtime 작업 없이.
infer + conditional 타입 + generic 이 타입-레벨 계산의 전체 toolkit. 야생의 대부분 고급 TypeScript 패턴이 이 셋의 조합.