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。
Related









