type Await = T extends Promise ? U : T; type AwaitAll = { [P in keyof T]: Await; }; export async function awaitAll(obj: T): Promise> { const target = {} as any; const keys = Object.keys(obj); const values = Object.values(obj); const resolvedValues = await Promise.all(values.map(value => (!value || !value.constructor || value.constructor.name !== 'Object') ? value : awaitAll(value) )); for (let i = 0; i < keys.length; i++) { target[keys[i]] = resolvedValues[i]; } return target; }