data의 타입은 무엇일까요? 자바스크립트를 알고 있으므로 data가 'hi'이고 string 타입이라는 것을 알 수 있습니다. 하지만 타입만으로도 확인할 수 있어야 합니다. 다시 Promise 인스턴스의 타입을 봅시다.
lib.es5.d.ts
interface Promise<T> {
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
}
then 메서드를 보면 첫 번째 매개변수인 onfulfilled의 타입을 확인할 수 있습니다.
Awaited<T>에서 T가 Promise인 상황이므로 T를 Promise<X>라고 해봅시다. X는 임의의 타입을 나타내는 미지수입니다. onfulfilled 콜백 함수의 타입은 (value: X) => TResult1 | PromiseLike<TResult1>) | undefined | null입니다. 이 함수가 Awaited<T>에서의 F입니다. 다시 F 함수에서 첫 번째 매개변수인 value를 찾을 수 있습니다. value의 타입은 X입니다. 이것이 Awaited<T>에서의 V입니다.