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;
}
CodePudding user response:
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;
// }