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
の中身の型がstring
やnumber
ではなく42
や'foo'
といった具体的な値の型になることが保証されます。
Mapped Typesを使う
Mapped Types
を使って、配列T
の各要素に対してAwaited
を適用します。Awaited
はPromise
の中身の型を取得する型です。
Authored by

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