00. Awaited
// 0. 시작
type Awaited = any
// 1. Awaited 의 제네릭으로 들어는 T는 Promise<> 의 형태여야한다.
type Awaited<T extends Promise<any>> = any
// 2. T 가 Promise<> 을 extends 하는지 알아본다. 만약 알맞은 형태라면 aa 가 inner type 이 된다.
type Awaited<T extends Promise<unknown>> = T extends Promise<> ? aa : bb
// 3. Promise 의 <> 에는 어떠한 타입이든지 다 들어올 수 있다. 따라서 '추론' 하자
// 추론된 타입은 R 이다.
type Awaited<T extends Promise<unknown>> = T extends Promise<infer R> ? aa : bb
// 4. Awaited의 제네릭 인자로 들어온 형태가 알맞은 Promise 형태라면, 추론한 R 을 리턴하면 된다.
type Awaited<T extends Promise<unknown>> = T extends Promise<infer R> ? R : TLast updated