T extends infer U ? U :Y
1)
type MyType<T> = T extends infer R ? R : null;
const a : MyType<number> = 123;
console.log(typeof a); //number
2) 유틸리티 타입
유틸리티 타입을 사용하게 되면 전역으로 타입이 작용하므로 따로 해당 타입(여기선 ReturnType)에 관해 따로 명시해 줄 필요가 없다
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
function fn(num : number) {
return num.toString();
declare function f1() : {
a : string,
b : number,
}
type T0 = ReturnType<() => string>; // string
type T1 = ReturnType<(s : string) => void>; // void
type T2 = ReturnType<typeof f1>; // {a : string , b : number}
}
const a : ReturnType<typeof fn> = "Hello"; // ReturnType<T> 이용
console.log(a); //Hello
3) Promise
type UnpackPromiseArray<P> = P extends Promise<infer K>[] ? K : any
const arr = [Promise.resolve(true)];
type ExpectedBoolean = UnpackPromiseArray<typeof arr> // boolean
type PromiseType<T> = T extends Promise<infer U> ? U : never;
type A = PromiseType<Promise<number>>; // number
type B = PromiseType<Promise<string | boolean>>; // string | boolean
type C = PromiseType<number>; // never