type PromiseTuple = readonly [ ...{ [K in keyof T]: Promise } ]; type ResolvedTuple = { [K in keyof T]: T[K]; }; export const awaitAll = async ( promises: PromiseTuple ): Promise> => { // eslint-disable-next-line no-restricted-properties, @typescript-eslint/await-thenable const result = await Promise.allSettled(promises); for (const res of result) { if (res.status === "rejected") { throw res.reason; } } // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion return result.map( // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion (res) => (res as PromiseFulfilledResult).value ) as ResolvedTuple; };