Promise<Awaited<string>>은 왜 Promise<string>이고, Awaited<Promise<Awaited<string>>>은 왜 string일까요? 알아봅시다. Awaited 타입은 다음과 같습니다. Promise 객체의 타입은 ES2015에서 선언되었는데, Awaited 타입은 더 예전 버전인 ES5에서 선언되었다는 점이 재미있습니다.
lib.es5.d.ts
type Awaited<T> =
T extends null | undefined ? T :
T extends object & { then(onfulfilled: infer F, ...args: infer _): any } ?
F extends ((value: infer V, ...args: infer _) => any) ?
Awaited<V> :
never :
T;
컨디셔널 타입이 세 번 중첩되어 나타나고 있습니다.
첫 번째 컨디셔널 타입은 T가 null이나 undefined인지 확인합니다. Awaited<null>은 null이고, Awaited<undefined>는 undefined입니다.