Awaited<T>
Awaited<T>
は、Promise
の解決値の型T
を取得するユーティリティ型です。
Promise
が解決するまでの非同期処理の結果が必要な場合や、async
/await
パターンで複数の入れ子になったPromise
の中から解決済みの値の型を取り出したい場合に非常に便利です。
Awaited<T>の型引数
T
型引数T
には、任意の型を渡します。それがPromise<V>
である場合は解決された型であるV
を返します。これはPromise
が何重にネストしていても、最終的な解決値の型を取得できます。
Awaitedの使用例
ts
typeAwaited1 =Awaited <string>;typeAwaited2 =Awaited <Promise <string>>;typeAwaited3 =Awaited <Promise <Promise <string>>>;
ts
typeAwaited1 =Awaited <string>;typeAwaited2 =Awaited <Promise <string>>;typeAwaited3 =Awaited <Promise <Promise <string>>>;
Promise
がネストしていても解決された値を取得できるのはなぜか
まずはAwaited<T>
の実装を見てみましょう。
ts
typeAwaited <T > =T extends null | undefined?T :T extends object & {then (onfulfilled : inferF , ...args : infer_ ): any }?F extends (value : inferV , ...args : infer_ ) => any?Awaited <V >: never:T ;
ts
typeAwaited <T > =T extends null | undefined?T :T extends object & {then (onfulfilled : inferF , ...args : infer_ ): any }?F extends (value : inferV , ...args : infer_ ) => any?Awaited <V >: never:T ;
少々複雑ですが、ひとつずつみていきましょう。
まずT
がnull
またはundefined
である場合はそのままT
を返します。次に、T
がobject
であり、then
メソッドを持つ場合は、そのthen
メソッドの第1引数の型を取得します。この型がPromise
の解決値である場合は再帰的にAwaited
を適用します。これにより、Promise
が何重にネストしていても、最終的な解決値の型を取得できるようになります。