Infer

T extends infer U ? X : Y

예시 - 배열의 요소 타입 추출

type ArrayElementType<T> = T extends (infer U)[] ? U : never;

type NumberArray = ArrayElementType<number[]>; // number;
type StringArray = ArrayElementType<string[]>; // string

예시 - 함수 반환 타입 추출

type ReturnType<T> = T extends (...args:any[])=> infer R ? R : never;

function greeting(){ return 'Hello, world' }
type GreetingReturn = ReturnType<typeof greeting>; // string;

예시 - 튜플의 첫번째 요소 타입 추출

type FirstElement<T> = T extends [infer F, ...any[]] ? F : never;

type FristOfTuple = FirstElement<[string, number, boolean]>; // string

예시 - 객체의 특정 프로퍼티 타입 추출

type PropertyType<T, K estends keyof T>= T extends { [P in K] : infer U} ? U : never;

왜 쓸까?