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。