infer는 조건부 타입 안에서 특정 타입을 추론할 수 있게 해주는 타입스크립트의 특수 문법임.infer는 보통 조건부 타입 내부에서 사용되며, 추론 가능한 타입이 있을 경우 해당 타입을 바탕으로 분기된 타입 결과를 생성함.ReturnType<T> 과 PromiseUnpack<T> 등의 유틸리티 타입 구현이 있음.type ReturnType<T> = T extends () => infer R ? R : never;
infer R은 함수 타입 T의 반환값을 추론해 R로 잡겠다는 의미임. 예시를 보자.
type FuncA = () => string;
type FuncB = () => number;
type A = ReturnType<FuncA>; // string
type B = ReturnType<FuncB>; // number
타입 변수 T에 함수 타입을 넣으면 해당 함수의 반환값 타입을 infer R이 추론하게 됨.
즉 FuncA는 () => string 타입이므로 R은 string이 되고, 따라서 A는 string 타입이 됨.
type C = ReturnType<number>; // never
이 경우에는 number 타입은 함수 타입이 아니므로 조건식을 만족하지 않음.
결과적으로 ReturnType<number>는 never 타입이 됨.
type PromiseUnpack<T> = T extends Promise<infer R> ? R : never;
PromiseUnpack은 Promise<T> 타입으로부터 내부의 T 타입을 꺼내오는 유틸리티 타입임.
예시:
type PromiseA = PromiseUnpack<Promise<number>>; // number
type PromiseB = PromiseUnpack<Promise<string>>; // string
infer R을 통해 Promise<number>는 number 타입이 추론되고, 최종적으로 PromiseUnpack<Promise<number>>는 number가 됨.
infer는 조건부 타입 내에서 특정 타입을 추론할 때 사용함.never 타입으로 수렴됨.