mosya

mosya<TC> - 関数PromiseAllに型をつけようの解説

この記事はmosya<TC>の問題の一つであるPromiseAll関数の解説になります。

問題

Promise ライクなオブジェクトの配列を受け取る関数 PromiseAll に型を付けてください。戻り値は Promise<T> である必要があります。ここで、T は解決された結果の配列です。

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise<string>((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

// expected to be `Promise<[number, 42, string]>`
const p = PromiseAll([promise1, promise2, promise3] as const)

解答例

declare function PromiseAll<T extends any[]>(values: readonly [...T]): Promise<{
  [P in keyof T]: Awaited<T[P]>
}>

readonlyで受け取る

PromiseAll関数の引数にはreadonlyをつけて、as constが付与された配列を受け取るように制限します。これにより、Promiseの中身の型がstringnumberではなく42'foo'といった具体的な値の型になることが保証されます。

Mapped Typesを使う

Mapped Typesを使って、配列Tの各要素に対してAwaitedを適用します。AwaitedPromiseの中身の型を取得する型です。

Authored by

筆者の写真

Godai@steelydylan

Webサービスを作るのが好きなWebエンジニア。子供が産まれたことをきっかけに独立し法人化。サービス開発が大好き。
好きな言語はTypeScript。

サイトの模写でプロを目指す
オンライン学習サービスを作りました!

詳しくはこちら
mosya

mosyaはオンラインでWeb制作を自学習できるサービスです。現役エンジニアが作成した豊富なカリキュラムに沿って学習を進めましょう。

© 2023 - mosya. All rights reserved.