Is this possible in Typescript?
I want to turn e.g. something like this:
interface IPromiseObject { promiseA: Promise<number>; promiseB: Promise<string>; }
Into this:
interface IResolvedPromiseObject { promiseA: number; promiseB: string; }
I want to use it to resolve an object with promises as values, but still stay type safe. In this example, I need to convert IPromiseObject
to an object with the same keys but the values resolved so that I can use it as return type.
export async function resolveAllObject<IPromiseObject>( promiseObject: IPromiseObject ): Promise<???> { const resolvedPromiseObject = {}; for ( const key in promiseObject ) { const value = await promiseObject[ key ]; Object.assign( resolvedPromiseObject, { [ key ]: value } ); } return resolvedPromiseObject; }
Advertisement
Answer
You can map over the properties and use the Awaited
utility type to extract the type inside the Promise.
type AwaitedObject<T> = { [K in keyof T]: Awaited<T[K]> }
Usage:
interface IPromiseObject { promiseA: Promise<number>; promiseB: Promise<string>; } type AwaitedObject<T> = { [K in keyof T]: Awaited<T[K]> } type IResolvedPromiseObject = AwaitedObject<IPromiseObject> // type IResolvedPromiseObject = { // promiseA: number; // promiseB: string; // }