infer - 조건부 타입

/**
 * infer (inference -> 추론하다)
 */

type FuncA = () => string;

type FuncB = () => number;

// infer R은 아래 조건식이 True로 만들 수 있는 추론을 해줌
type ReturnType<T> = T extends () => infer R ? R : never;

type A = ReturnType<FuncA>; // string 나옴

type B = ReturnType<FuncB>; // number 나옴

type C = ReturnType<number>; // never 타입 나옴 (추론 불가)

/**
 * 예제 
 */

type PromiseUnpack<T> = T extends Promise<infer R> ? R : never;
// 1. T는 프로미스 타입이어야 한다.
// 2. 프로미스 타입의 결과값 타입을 반환해야 한다.

type PromiseA = PromiseUnpack<Promise<number>>;
// number

type PromiseB = PromiseUnpack<Promise<string>>;
// string