From e3522fdd919f8686d2ee1cacb89621d338c8c895 Mon Sep 17 00:00:00 2001 From: Emily Marigold Klassen Date: Thu, 31 Jan 2019 14:48:03 -0800 Subject: [PATCH] Use conditional type inference for promise resolution This improves the quality of the type resolution for promise constructor methods, as using conditional type inference is distributive, whereas the inference provided by arguments is not. Alternatively, the arguments based inference could be improved, but that would be a completely different kind of change. --- src/lib/es2015.promise.d.ts | 44 ++++++++++++++++++------------------- src/lib/es5.d.ts | 5 +++++ 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/lib/es2015.promise.d.ts b/src/lib/es2015.promise.d.ts index 2a98f215193a0..5338a4e7d36d3 100644 --- a/src/lib/es2015.promise.d.ts +++ b/src/lib/es2015.promise.d.ts @@ -10,7 +10,7 @@ interface PromiseConstructor { * a resolve callback used to resolve the promise with a value or the result of another promise, * and a reject callback used to reject the promise with a provided reason or error. */ - new (executor: (resolve: (value?: T | PromiseLike) => void, reject: (reason?: any) => void) => void): Promise; + new (executor: (resolve: (value?: T) => void, reject: (reason?: any) => void) => void): Promise>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -18,7 +18,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike , T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike, T10 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; + all(values: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]): Promise<[ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -26,7 +26,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike , T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; + all(values: [T1, T2, T3, T4, T5, T6, T7, T8, T9]): Promise<[ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -34,7 +34,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike , T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>; + all(values: [T1, T2, T3, T4, T5, T6, T7, T8]): Promise<[ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -42,7 +42,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike , T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6, T7]>; + all(values: [T1, T2, T3, T4, T5, T6, T7]): Promise<[ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -50,7 +50,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike , T5 | PromiseLike, T6 | PromiseLike]): Promise<[T1, T2, T3, T4, T5, T6]>; + all(values: [T1, T2, T3, T4, T5, T6]): Promise<[ResolveType, ResolveType, ResolveType, ResolveType, ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -58,7 +58,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike , T5 | PromiseLike]): Promise<[T1, T2, T3, T4, T5]>; + all(values: [T1, T2, T3, T4, T5]): Promise<[ResolveType, ResolveType, ResolveType, ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -66,7 +66,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike ]): Promise<[T1, T2, T3, T4]>; + all(values: [T1, T2, T3, T4]): Promise<[ResolveType, ResolveType, ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -74,7 +74,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike]): Promise<[T1, T2, T3]>; + all(values: [T1, T2, T3]): Promise<[ResolveType, ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -82,7 +82,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: [T1 | PromiseLike, T2 | PromiseLike]): Promise<[T1, T2]>; + all(values: [T1, T2]): Promise<[ResolveType, ResolveType]>; /** * Creates a Promise that is resolved with an array of results when all of the provided Promises @@ -90,7 +90,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - all(values: (T | PromiseLike)[]): Promise; + all(values: ReadonlyArray): Promise[]>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -98,7 +98,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike, T10 | PromiseLike]): Promise; + race(values: [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -106,7 +106,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike, T9 | PromiseLike]): Promise; + race(values: [T1, T2, T3, T4, T5, T6, T7, T8, T9]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -114,7 +114,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike, T8 | PromiseLike]): Promise; + race(values: [T1, T2, T3, T4, T5, T6, T7, T8]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -122,7 +122,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike, T7 | PromiseLike]): Promise; + race(values: [T1, T2, T3, T4, T5, T6, T7]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -130,7 +130,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike, T6 | PromiseLike]): Promise; + race(values: [T1, T2, T3, T4, T5, T6]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -138,7 +138,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike, T5 | PromiseLike]): Promise; + race(values: [T1, T2, T3, T4, T5]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -146,7 +146,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike, T4 | PromiseLike]): Promise; + race(values: [T1, T2, T3, T4]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -154,7 +154,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike, T3 | PromiseLike]): Promise; + race(values: [T1, T2, T3]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -162,7 +162,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: [T1 | PromiseLike, T2 | PromiseLike]): Promise; + race(values: [T1, T2]): Promise>; /** * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved @@ -170,7 +170,7 @@ interface PromiseConstructor { * @param values An array of Promises. * @returns A new Promise. */ - race(values: (T | PromiseLike)[]): Promise; + race(values: ReadonlyArray): Promise>; /** * Creates a new rejected promise for the provided reason. @@ -184,7 +184,7 @@ interface PromiseConstructor { * @param value A promise. * @returns A promise whose internal state matches the provided promise. */ - resolve(value: T | PromiseLike): Promise; + resolve(value: T): Promise>; /** * Creates a new resolved promise . diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts index 8dc6ee90a2ed7..903fa71e3fac6 100644 --- a/src/lib/es5.d.ts +++ b/src/lib/es5.d.ts @@ -1468,6 +1468,11 @@ type ReturnType any> = T extends (...args: any[]) */ type InstanceType any> = T extends new (...args: any[]) => infer R ? R : any; +/** + * Obtain the resolved type of a PromiseLike type + */ +type ResolveType = T extends PromiseLike ? R : T + /** * Marker for contextual 'this' type */