Created
December 9, 2021 17:14
-
-
Save holgergp/897dc7f34dd35bcfc3464cc9f61f55a3 to your computer and use it in GitHub Desktop.
Experiments with the new Awaited Type in Typescript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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