(Inference)
type Func = () => string;
type ReturnType<T> = T extends () => string ? string : never;
type A = ReturnType<Func>; // string
type B
는 never
타입이 나온다 (원하는 결과는 number
타입)type FuncA = () => string;
type FuncB = () => number;
type ReturnType<T> = T extends () => string ? string : never;
type A = ReturnType<FuncA>; // string
type B = ReturnType<FuncB>; // never
type FuncA = () => string;
type FuncB = () => number;
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> = any;
// 요구사항
// 1. T는 프로미스 타입이어야 함
// 2. 프로미스 타입의 결과값 타입을 반환하여야 함
type PromiseA = PromiseUnpack<Promise<number>>;
// number타입원함
type PromiseB = PromiseUnpack<Promise<string>>;
// string타입원함
type PromiseUnpack<T> = T extends Promise<infer R> ? R :never;
type PromiseA = PromiseUnpack<Promise<number>>; // number
type PromiseB = PromiseUnpack<Promise<string>>; // string