Skip to content

Instantly share code, notes, and snippets.

@holgergp
Created December 9, 2021 17:14
Show Gist options
  • Save holgergp/897dc7f34dd35bcfc3464cc9f61f55a3 to your computer and use it in GitHub Desktop.
Save holgergp/897dc7f34dd35bcfc3464cc9f61f55a3 to your computer and use it in GitHub Desktop.
Experiments with the new Awaited Type in Typescript
declare function MaybePromise<T>(value: T): T | Promise<T> | PromiseLike<T>
declare function MaybeNumberPromise(value: number): number | Promise<number> | PromiseLike<number>
declare type MaybePromiseType = ReturnType<typeof MaybeNumberPromise>
//Does not work at all!
async function doSomethingSpecial(): Awaited<[number, number]> {
const result = await Promise.all([MaybePromise(100), MaybePromise(200)]);
// Error!
//
// [number | Promise<100>, number | Promise<200>]
//
// is not assignable to type
//
// [number, number]
return result;
}
//Works in 4.5 not in 4.4
async function doSomething(): Promise<[number, number]> {
const result = await Promise.all([MaybePromise(100), MaybePromise(200)]);
// Error!
//
// [number | Promise<100>, number | Promise<200>]
//
// is not assignable to type
//
// [number, number]
return result;
}
//Works in 4.5 not in 4.4
async function doSomethingWithAwaited(): Promise<[number, number]> {
//4.4 Does not know Awaited
const result: Awaited<[number,number]> = await Promise.all([MaybePromise(100), MaybePromise(200)]);
return result;
}
//Works in 4.5 and in 4.4
async function doSomethingWithAnyTypes(): Promise<[number, number]> {
const promiseAllResult: Promise<[any, any]> = Promise.all([MaybePromise(100), MaybePromise(200)]);
const result:[any, any] = await promiseAllResult
return result;
}
//Works in 4.5 not in 4.4
async function doSomethingWithExplicitTypesIn44(): Promise<[number, number]> {
const promiseAllResult: Promise<[number,number]> = Promise.all([MaybePromise(100), MaybePromise(200)]);
const result = await promiseAllResult
return result;
}
//Works in 4.5 not in 4.4
async function doSomethingWithExplicitTypesIn45(): Promise<[number, number]> {
const promiseAllResult: Promise<[Awaited<number>,Awaited<number>]> = Promise.all([MaybePromise(100), MaybePromise(200)]);
const anotherPromiseAllResult: Promise<[number, number]> = promiseAllResult
//const result1:[MaybePromiseType<number>, MaybePromiseType<number>] = await promiseAllResult
//const result2:[number, number] = await promiseAllResult
//const result3:[Promise<number>, Promise<number>] = await promiseAllResult
const result: Awaited<[number,number]> = await anotherPromiseAllResult
return result;
}
//Works in 4.5 not in 4.4
async function doSomethingWithImplicitTypes(): Promise<[number, number]> {
const promiseAllResult = Promise.all([MaybePromise(100), MaybePromise(200)]);
//const result1:[MaybePromiseType<number>, MaybePromiseType<number>] = await promiseAllResult
//const result2:[number, number] = await promiseAllResult
//const result3:[Promise<number>, Promise<number>] = await promiseAllResult
const result: Awaited<[number,number]> = await promiseAllResult
return result;
}
async function doSomethingNonGeneric(): Promise<[number, number]> {
const result = await Promise.all([MaybeNumberPromise(100), MaybeNumberPromise(200)]);
// Error!
//
// [number | Promise<100>, number | Promise<200>]
//
// is not assignable to type
//
// [number, number]
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment