즉, T가 Promise 객체일 때 Awaited<T>는 Awaited<V>가 되는데 T는 Promise<X>이고, V는 X입니다. 따라서 Awaited<Promise<X>>는 Awaited<X>가 됩니다. 이것을 규칙 2번이라고 하겠습니다.
규칙 2번: Awaited<Promise<T>> === Awaited<T>
이제 분석하려는 코드를 다시 봅시다.
const str1 = Promise.resolve('promise');
// const str1: Promise<string>
const str2 = await Promise.resolve('promise');
// const str2: string
export {};
str2는 Awaited<Promise<Awaited<string>>> 타입입니다. 이 타입은 규칙 1번에 의해 Awaited<Promise<string>>이고, 이것은 규칙 2번에 의해 Awaited<string>입니다. 그리고 다시 규칙 1번에 의해 최종적으로 string이 됩니다.
이번에는 Promise.all 결과물의 타입이 어떻게 제대로 추론되는지를 분석해보겠습니다. 분석하려는 코드는 다음과 같습니다.