infer는 조건부 타입에서 특정 타입을 추론하는 데 사용
즉, 타입을 직접 지정하는 것이 아닌 TS가 해당 타입을 유추할 수 있도록 돕는 역할
infer는 extends를 사용하는 조건부 타입 안에서 활용, 특정 타입 분해하여 사용할 수 있음
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
함수타입T의 반환 타입을 추출하는 유틸리티 타입
T가 함수타입이면 infer R을 통해 반환 타입 R로 추론하고, 아니면 never을 반환
type ReturnType = GetReturnType<() => string>; // string
주의할 점은, infer는 반드시 조건부 타입 안에서 사용되어야 함
독립적으로 사용하면 문법 오류 발생함
type Example<T extends string> = T;
type Check<T> = T extends string ? '문자열' : '다른 타입';
type Example1 = Check<'hello'>; // '문자열'
type Example2 = Check<42>; // '다른 타입'