조건부 타입 (Conditional Types)

type IsString<T> = T extends string ? true : false;
type T1 = IsString<string>;  
type T2 = IsString<number>;

분산적인 조건부 타입 (Distributive Conditional Types)

// -- 특정 타입을 유니온에서 제거하는 예제 --
type Exclude<T, U> = T extends U ? never : T;
type Result = Exclude<string | number | boolean, number>;
// (string | number | boolean) extends U ? never : T;
// (string extends U ? never : T;) | (number extends U ? never : T;) | (boolean extends U ? never : T;)
// string extends number ? never : string; // string
// number extends number ? never : number; // never
// boolean extends number ? never : boolean; // boolean
// string | boolean

infer 키워드

// -- 리턴 타입을 추출하는 유틸리티 --
type GetReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
function getName() { return '홍길동'; }

type GetNameReturnType = GetReturnType<typeof getName>;

// -- 배열 요소의 타입 추출 --
type UnpackArray<T> = T extends (infer U)[] ? U : never;
type strArr = UnpackArray<string[]>;
type numArr = UnpackArray<number[]>;
type sArr = UnpackArray<'asdasd'>;