diff --git a/bluebird/bluebird-tests.ts b/bluebird/bluebird-tests.ts index 5f96d28efc..278b1d2297 100644 --- a/bluebird/bluebird-tests.ts +++ b/bluebird/bluebird-tests.ts @@ -85,15 +85,15 @@ var bazProm: Promise; // - - - - - - - - - - - - - - - - - -var numThen: Promise.Thenable; -var strThen: Promise.Thenable; -var anyThen: Promise.Thenable; -var boolThen: Promise.Thenable; -var objThen: Promise.Thenable; -var voidThen: Promise.Thenable; +var numThen: PromiseLike; +var strThen: PromiseLike; +var anyThen: PromiseLike; +var boolThen: PromiseLike; +var objThen: PromiseLike; +var voidThen: PromiseLike; -var fooThen: Promise.Thenable; -var barThen: Promise.Thenable; +var fooThen: PromiseLike; +var barThen: PromiseLike; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -106,12 +106,12 @@ var barArrProm: Promise; // - - - - - - - - - - - - - - - - - -var numArrThen: Promise.Thenable; -var strArrThen: Promise.Thenable; -var anyArrThen: Promise.Thenable; +var numArrThen: PromiseLike; +var strArrThen: PromiseLike; +var anyArrThen: PromiseLike; -var fooArrThen: Promise.Thenable; -var barArrThen: Promise.Thenable; +var fooArrThen: PromiseLike; +var barArrThen: PromiseLike; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -124,18 +124,18 @@ var barPromArr: Promise[]; // - - - - - - - - - - - - - - - - - -var numThenArr: Promise.Thenable[]; -var strThenArr: Promise.Thenable[]; -var anyThenArr: Promise.Thenable[]; +var numThenArr: PromiseLike[]; +var strThenArr: PromiseLike[]; +var anyThenArr: PromiseLike[]; -var fooThenArr: Promise.Thenable[]; -var barThenArr: Promise.Thenable[]; +var fooThenArr: PromiseLike[]; +var barThenArr: PromiseLike[]; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // booya! -var fooThenArrThen: Promise.Thenable[]>; -var barThenArrThen: Promise.Thenable[]>; +var fooThenArrThen: PromiseLike[]>; +var barThenArrThen: PromiseLike[]>; var fooResolver: Promise.Resolver; var barResolver: Promise.Resolver; diff --git a/bluebird/bluebird.d.ts b/bluebird/bluebird.d.ts index a5aca278be..ea8bebe0c2 100644 --- a/bluebird/bluebird.d.ts +++ b/bluebird/bluebird.d.ts @@ -22,7 +22,7 @@ interface PromiseConstructor { /** * Create a new promise. The passed in function will receive functions `resolve` and `reject` as its arguments which can be called to seal the fate of the created promise. */ - new (callback: (resolve: (thenableOrResult?: T | Promise.Thenable) => void, reject: (error: any) => void) => void): Promise; + new (callback: (resolve: (thenableOrResult?: T | PromiseLike) => void, reject: (error: any) => void) => void): Promise; // Ideally, we'd define e.g. "export class RangeError extends Error {}", // but as Error is defined as an interface (not a class), TypeScript doesn't @@ -51,10 +51,10 @@ interface PromiseConstructor { * * Alias for `attempt();` for compatibility with earlier ECMAScript version. */ - try(fn: () => Promise.Thenable, args?: any[], ctx?: any): Promise; + try(fn: () => PromiseLike, args?: any[], ctx?: any): Promise; try(fn: () => T, args?: any[], ctx?: any): Promise; - attempt(fn: () => Promise.Thenable, args?: any[], ctx?: any): Promise; + attempt(fn: () => PromiseLike, args?: any[], ctx?: any): Promise; attempt(fn: () => T, args?: any[], ctx?: any): Promise; /** @@ -67,7 +67,7 @@ interface PromiseConstructor { * Create a promise that is resolved with the given `value`. If `value` is a thenable or promise, the returned promise will assume its state. */ resolve(): Promise; - resolve(value: Promise.Thenable): Promise; + resolve(value: PromiseLike): Promise; resolve(value: T): Promise; /** @@ -84,7 +84,7 @@ interface PromiseConstructor { /** * Cast the given `value` to a trusted promise. If `value` is already a trusted `Promise`, it is returned as is. If `value` is not a thenable, a fulfilled is: Promise returned with `value` as its fulfillment value. If `value` is a thenable (Promise-like object, like those returned by jQuery's `$.ajax`), returns a trusted that: Promise assimilates the state of the thenable. */ - cast(value: Promise.Thenable): Promise; + cast(value: PromiseLike): Promise; cast(value: T): Promise; /** @@ -106,7 +106,7 @@ interface PromiseConstructor { * Returns a promise that will be fulfilled with `value` (or `undefined`) after given `ms` milliseconds. If `value` is a promise, the delay will start counting down when it is fulfilled and the returned promise will be fulfilled with the fulfillment value of the `value` promise. */ // TODO enable more overloads - delay(value: Promise.Thenable, ms: number): Promise; + delay(value: PromiseLike, ms: number): Promise; delay(value: T, ms: number): Promise; delay(ms: number): Promise; @@ -170,16 +170,16 @@ interface PromiseConstructor { */ // TODO enable more overloads // promise of array with promises of value - all(values: Promise.Thenable[]>): Promise; + all(values: PromiseLike[]>): Promise; // promise of array with values - all(values: Promise.Thenable): Promise; + all(values: PromiseLike): Promise; // array with promises of value - all(values: Promise.Thenable[]): Promise; + all(values: PromiseLike[]): Promise; // array with promises of different types - all(values: [Promise.Thenable, Promise.Thenable]): Promise<[T1, T2]>; - all(values: [Promise.Thenable, Promise.Thenable, Promise.Thenable]): Promise<[T1, T2, T3]>; - all(values: [Promise.Thenable, Promise.Thenable, Promise.Thenable, Promise.Thenable]): Promise<[T1, T2, T3, T4]>; - all(values: [Promise.Thenable, Promise.Thenable, Promise.Thenable, Promise.Thenable, Promise.Thenable]): Promise<[T1, T2, T3, T4, T5]>; + all(values: [PromiseLike, PromiseLike]): Promise<[T1, T2]>; + all(values: [PromiseLike, PromiseLike, PromiseLike]): Promise<[T1, T2, T3]>; + all(values: [PromiseLike, PromiseLike, PromiseLike, PromiseLike]): Promise<[T1, T2, T3, T4]>; + all(values: [PromiseLike, PromiseLike, PromiseLike, PromiseLike, PromiseLike]): Promise<[T1, T2, T3, T4, T5]>; // array with values all(values: T[]): Promise; @@ -202,11 +202,11 @@ interface PromiseConstructor { * *original: The array is not modified. The input array sparsity is retained in the resulting array.* */ // promise of array with promises of value - settle(values: Promise.Thenable[]>): Promise[]>; + settle(values: PromiseLike[]>): Promise[]>; // promise of array with values - settle(values: Promise.Thenable): Promise[]>; + settle(values: PromiseLike): Promise[]>; // array with promises of value - settle(values: Promise.Thenable[]): Promise[]>; + settle(values: PromiseLike[]): Promise[]>; // array with values settle(values: T[]): Promise[]>; @@ -214,11 +214,11 @@ interface PromiseConstructor { * Like `Promise.some()`, with 1 as `count`. However, if the promise fulfills, the fulfillment value is not an array of 1 but the value directly. */ // promise of array with promises of value - any(values: Promise.Thenable[]>): Promise; + any(values: PromiseLike[]>): Promise; // promise of array with values - any(values: Promise.Thenable): Promise; + any(values: PromiseLike): Promise; // array with promises of value - any(values: Promise.Thenable[]): Promise; + any(values: PromiseLike[]): Promise; // array with values any(values: T[]): Promise; @@ -228,11 +228,11 @@ interface PromiseConstructor { * **Note** If you pass empty array or a sparse array with no values, or a promise/thenable for such, it will be forever pending. */ // promise of array with promises of value - race(values: Promise.Thenable[]>): Promise; + race(values: PromiseLike[]>): Promise; // promise of array with values - race(values: Promise.Thenable): Promise; + race(values: PromiseLike): Promise; // array with promises of value - race(values: Promise.Thenable[]): Promise; + race(values: PromiseLike[]): Promise; // array with values race(values: T[]): Promise; @@ -244,11 +244,11 @@ interface PromiseConstructor { * *The original array is not modified.* */ // promise of array with promises of value - some(values: Promise.Thenable[]>, count: number): Promise; + some(values: PromiseLike[]>, count: number): Promise; // promise of array with values - some(values: Promise.Thenable, count: number): Promise; + some(values: PromiseLike, count: number): Promise; // array with promises of value - some(values: Promise.Thenable[], count: number): Promise; + some(values: PromiseLike[], count: number): Promise; // array with values some(values: T[], count: number): Promise; @@ -256,7 +256,7 @@ interface PromiseConstructor { * Like `Promise.all()` but instead of having to pass an array, the array is generated from the passed variadic arguments. */ // variadic array with promises of value - join(...values: Promise.Thenable[]): Promise; + join(...values: PromiseLike[]): Promise; // variadic array with values join(...values: T[]): Promise; @@ -268,19 +268,19 @@ interface PromiseConstructor { * *The original array is not modified.* */ // promise of array with promises of value - map(values: Promise.Thenable[]>, mapper: (item: T, index: number, arrayLength: number) => Promise.Thenable, options?: Promise.ConcurrencyOption): Promise; - map(values: Promise.Thenable[]>, mapper: (item: T, index: number, arrayLength: number) => U, options?: Promise.ConcurrencyOption): Promise; + map(values: PromiseLike[]>, mapper: (item: T, index: number, arrayLength: number) => PromiseLike, options?: Promise.ConcurrencyOption): Promise; + map(values: PromiseLike[]>, mapper: (item: T, index: number, arrayLength: number) => U, options?: Promise.ConcurrencyOption): Promise; // promise of array with values - map(values: Promise.Thenable, mapper: (item: T, index: number, arrayLength: number) => Promise.Thenable, options?: Promise.ConcurrencyOption): Promise; - map(values: Promise.Thenable, mapper: (item: T, index: number, arrayLength: number) => U, options?: Promise.ConcurrencyOption): Promise; + map(values: PromiseLike, mapper: (item: T, index: number, arrayLength: number) => PromiseLike, options?: Promise.ConcurrencyOption): Promise; + map(values: PromiseLike, mapper: (item: T, index: number, arrayLength: number) => U, options?: Promise.ConcurrencyOption): Promise; // array with promises of value - map(values: Promise.Thenable[], mapper: (item: T, index: number, arrayLength: number) => Promise.Thenable, options?: Promise.ConcurrencyOption): Promise; - map(values: Promise.Thenable[], mapper: (item: T, index: number, arrayLength: number) => U, options?: Promise.ConcurrencyOption): Promise; + map(values: PromiseLike[], mapper: (item: T, index: number, arrayLength: number) => PromiseLike, options?: Promise.ConcurrencyOption): Promise; + map(values: PromiseLike[], mapper: (item: T, index: number, arrayLength: number) => U, options?: Promise.ConcurrencyOption): Promise; // array with values - map(values: T[], mapper: (item: T, index: number, arrayLength: number) => Promise.Thenable, options?: Promise.ConcurrencyOption): Promise; + map(values: T[], mapper: (item: T, index: number, arrayLength: number) => PromiseLike, options?: Promise.ConcurrencyOption): Promise; map(values: T[], mapper: (item: T, index: number, arrayLength: number) => U, options?: Promise.ConcurrencyOption): Promise; /** @@ -291,16 +291,16 @@ interface PromiseConstructor { * *The original array is not modified.* */ // promise of array with promises of value - mapSeries(values: Promise.Thenable[]>, mapper: (item: R, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + mapSeries(values: PromiseLike[]>, mapper: (item: R, index: number, arrayLength: number) => U | PromiseLike): Promise; // promise of array with values - mapSeries(values: Promise.Thenable, mapper: (item: R, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + mapSeries(values: PromiseLike, mapper: (item: R, index: number, arrayLength: number) => U | PromiseLike): Promise; // array with promises of value - mapSeries(values: Promise.Thenable[], mapper: (item: R, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + mapSeries(values: PromiseLike[], mapper: (item: R, index: number, arrayLength: number) => U | PromiseLike): Promise; // array with values - mapSeries(values: R[], mapper: (item: R, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + mapSeries(values: R[], mapper: (item: R, index: number, arrayLength: number) => U | PromiseLike): Promise; /** @@ -311,19 +311,19 @@ interface PromiseConstructor { * *The original array is not modified. If no `intialValue` is given and the array doesn't contain at least 2 items, the callback will not be called and `undefined` is returned. If `initialValue` is given and the array doesn't have at least 1 item, `initialValue` is returned.* */ // promise of array with promises of value - reduce(values: Promise.Thenable[]>, reducer: (total: U, current: T, index: number, arrayLength: number) => Promise.Thenable, initialValue?: U): Promise; - reduce(values: Promise.Thenable[]>, reducer: (total: U, current: T, index: number, arrayLength: number) => U, initialValue?: U): Promise; + reduce(values: PromiseLike[]>, reducer: (total: U, current: T, index: number, arrayLength: number) => PromiseLike, initialValue?: U): Promise; + reduce(values: PromiseLike[]>, reducer: (total: U, current: T, index: number, arrayLength: number) => U, initialValue?: U): Promise; // promise of array with values - reduce(values: Promise.Thenable, reducer: (total: U, current: T, index: number, arrayLength: number) => Promise.Thenable, initialValue?: U): Promise; - reduce(values: Promise.Thenable, reducer: (total: U, current: T, index: number, arrayLength: number) => U, initialValue?: U): Promise; + reduce(values: PromiseLike, reducer: (total: U, current: T, index: number, arrayLength: number) => PromiseLike, initialValue?: U): Promise; + reduce(values: PromiseLike, reducer: (total: U, current: T, index: number, arrayLength: number) => U, initialValue?: U): Promise; // array with promises of value - reduce(values: Promise.Thenable[], reducer: (total: U, current: T, index: number, arrayLength: number) => Promise.Thenable, initialValue?: U): Promise; - reduce(values: Promise.Thenable[], reducer: (total: U, current: T, index: number, arrayLength: number) => U, initialValue?: U): Promise; + reduce(values: PromiseLike[], reducer: (total: U, current: T, index: number, arrayLength: number) => PromiseLike, initialValue?: U): Promise; + reduce(values: PromiseLike[], reducer: (total: U, current: T, index: number, arrayLength: number) => U, initialValue?: U): Promise; // array with values - reduce(values: T[], reducer: (total: U, current: T, index: number, arrayLength: number) => Promise.Thenable, initialValue?: U): Promise; + reduce(values: T[], reducer: (total: U, current: T, index: number, arrayLength: number) => PromiseLike, initialValue?: U): Promise; reduce(values: T[], reducer: (total: U, current: T, index: number, arrayLength: number) => U, initialValue?: U): Promise; /** @@ -334,19 +334,19 @@ interface PromiseConstructor { * *The original array is not modified. */ // promise of array with promises of value - filter(values: Promise.Thenable[]>, filterer: (item: T, index: number, arrayLength: number) => Promise.Thenable, option?: Promise.ConcurrencyOption): Promise; - filter(values: Promise.Thenable[]>, filterer: (item: T, index: number, arrayLength: number) => boolean, option?: Promise.ConcurrencyOption): Promise; + filter(values: PromiseLike[]>, filterer: (item: T, index: number, arrayLength: number) => PromiseLike, option?: Promise.ConcurrencyOption): Promise; + filter(values: PromiseLike[]>, filterer: (item: T, index: number, arrayLength: number) => boolean, option?: Promise.ConcurrencyOption): Promise; // promise of array with values - filter(values: Promise.Thenable, filterer: (item: T, index: number, arrayLength: number) => Promise.Thenable, option?: Promise.ConcurrencyOption): Promise; - filter(values: Promise.Thenable, filterer: (item: T, index: number, arrayLength: number) => boolean, option?: Promise.ConcurrencyOption): Promise; + filter(values: PromiseLike, filterer: (item: T, index: number, arrayLength: number) => PromiseLike, option?: Promise.ConcurrencyOption): Promise; + filter(values: PromiseLike, filterer: (item: T, index: number, arrayLength: number) => boolean, option?: Promise.ConcurrencyOption): Promise; // array with promises of value - filter(values: Promise.Thenable[], filterer: (item: T, index: number, arrayLength: number) => Promise.Thenable, option?: Promise.ConcurrencyOption): Promise; - filter(values: Promise.Thenable[], filterer: (item: T, index: number, arrayLength: number) => boolean, option?: Promise.ConcurrencyOption): Promise; + filter(values: PromiseLike[], filterer: (item: T, index: number, arrayLength: number) => PromiseLike, option?: Promise.ConcurrencyOption): Promise; + filter(values: PromiseLike[], filterer: (item: T, index: number, arrayLength: number) => boolean, option?: Promise.ConcurrencyOption): Promise; // array with values - filter(values: T[], filterer: (item: T, index: number, arrayLength: number) => Promise.Thenable, option?: Promise.ConcurrencyOption): Promise; + filter(values: T[], filterer: (item: T, index: number, arrayLength: number) => PromiseLike, option?: Promise.ConcurrencyOption): Promise; filter(values: T[], filterer: (item: T, index: number, arrayLength: number) => boolean, option?: Promise.ConcurrencyOption): Promise; /** @@ -355,30 +355,30 @@ interface PromiseConstructor { * Resolves to the original array unmodified, this method is meant to be used for side effects. If the iterator function returns a promise or a thenable, the result for the promise is awaited for before continuing with next iteration. */ // promise of array with promises of value - each(values: Promise.Thenable[]>, iterator: (item: T, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + each(values: PromiseLike[]>, iterator: (item: T, index: number, arrayLength: number) => U | PromiseLike): Promise; // array with promises of value - each(values: Promise.Thenable[], iterator: (item: T, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + each(values: PromiseLike[], iterator: (item: T, index: number, arrayLength: number) => U | PromiseLike): Promise; // array with values OR promise of array with values - each(values: T[] | Promise.Thenable, iterator: (item: T, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + each(values: T[] | PromiseLike, iterator: (item: T, index: number, arrayLength: number) => U | PromiseLike): Promise; } -interface Promise extends Promise.Thenable, Promise.Inspection { +interface Promise extends PromiseLike, Promise.Inspection { /** * Promises/A+ `.then()` with progress handler. Returns a new promise chained from this promise. The new promise will be rejected or resolved dedefer on the passed `fulfilledHandler`, `rejectedHandler` and the state of this promise. */ - then(onFulfill: (value: T) => U | Promise.Thenable, onReject?: (error: any) => U | Promise.Thenable, onProgress?: (note: any) => any): Promise; - then(onFulfill: (value: T) => U | Promise.Thenable, onReject?: (error: any) => void | Promise.Thenable, onProgress?: (note: any) => any): Promise; + then(onFulfill: (value: T) => U | PromiseLike, onReject?: (error: any) => U | PromiseLike, onProgress?: (note: any) => any): Promise; + then(onFulfill: (value: T) => U | PromiseLike, onReject?: (error: any) => void | PromiseLike, onProgress?: (note: any) => any): Promise; /** * This is a catch-all exception handler, shortcut for calling `.then(null, handler)` on this promise. Any exception happening in a `.then`-chain will propagate to nearest `.catch` handler. * * Alias `.caught();` for compatibility with earlier ECMAScript version. */ - catch(onReject?: (error: any) => T | Promise.Thenable | void | Promise.Thenable): Promise; - caught(onReject?: (error: any) => T | Promise.Thenable | void | Promise.Thenable): Promise; + catch(onReject?: (error: any) => T | PromiseLike | void | PromiseLike): Promise; + caught(onReject?: (error: any) => T | PromiseLike | void | PromiseLike): Promise; - catch(onReject?: (error: any) => U | Promise.Thenable): Promise; - caught(onReject?: (error: any) => U | Promise.Thenable): Promise; + catch(onReject?: (error: any) => U | PromiseLike): Promise; + caught(onReject?: (error: any) => U | PromiseLike): Promise; /** * This extends `.catch` to work more like catch-clauses in languages like Java or C#. Instead of manually checking `instanceof` or `.name === "SomeError"`, you may specify a number of error constructors which are eligible for this catch handler. The catch handler that is first met that has eligible constructors specified, is the one that will be called. @@ -387,23 +387,23 @@ interface Promise extends Promise.Thenable, Promise.Inspection { * * Alias `.caught();` for compatibility with earlier ECMAScript version. */ - catch(predicate: (error: any) => boolean, onReject: (error: any) => T | Promise.Thenable | void | Promise.Thenable): Promise; - caught(predicate: (error: any) => boolean, onReject: (error: any) => T | Promise.Thenable | void | Promise.Thenable): Promise; + catch(predicate: (error: any) => boolean, onReject: (error: any) => T | PromiseLike | void | PromiseLike): Promise; + caught(predicate: (error: any) => boolean, onReject: (error: any) => T | PromiseLike | void | PromiseLike): Promise; - catch(predicate: (error: any) => boolean, onReject: (error: any) => U | Promise.Thenable): Promise; - caught(predicate: (error: any) => boolean, onReject: (error: any) => U | Promise.Thenable): Promise; + catch(predicate: (error: any) => boolean, onReject: (error: any) => U | PromiseLike): Promise; + caught(predicate: (error: any) => boolean, onReject: (error: any) => U | PromiseLike): Promise; - catch(ErrorClass: Function, onReject: (error: any) => T | Promise.Thenable | void | Promise.Thenable): Promise; - caught(ErrorClass: Function, onReject: (error: any) => T | Promise.Thenable | void | Promise.Thenable): Promise; + catch(ErrorClass: Function, onReject: (error: any) => T | PromiseLike | void | PromiseLike): Promise; + caught(ErrorClass: Function, onReject: (error: any) => T | PromiseLike | void | PromiseLike): Promise; - catch(ErrorClass: Function, onReject: (error: any) => U | Promise.Thenable): Promise; - caught(ErrorClass: Function, onReject: (error: any) => U | Promise.Thenable): Promise; + catch(ErrorClass: Function, onReject: (error: any) => U | PromiseLike): Promise; + caught(ErrorClass: Function, onReject: (error: any) => U | PromiseLike): Promise; /** * Like `.catch` but instead of catching all types of exceptions, it only catches those that don't originate from thrown errors but rather from explicit rejections. */ - error(onReject: (reason: any) => Promise.Thenable): Promise; + error(onReject: (reason: any) => PromiseLike): Promise; error(onReject: (reason: any) => U): Promise; /** @@ -411,10 +411,10 @@ interface Promise extends Promise.Thenable, Promise.Inspection { * * Alias `.lastly();` for compatibility with earlier ECMAScript version. */ - finally(handler: () => Promise.Thenable): Promise; + finally(handler: () => PromiseLike): Promise; finally(handler: () => U): Promise; - lastly(handler: () => Promise.Thenable): Promise; + lastly(handler: () => PromiseLike): Promise; lastly(handler: () => U): Promise; /** @@ -425,15 +425,15 @@ interface Promise extends Promise.Thenable, Promise.Inspection { /** * Like `.then()`, but any unhandled rejection that ends up here will be thrown as an error. */ - done(onFulfilled: (value: T) => Promise.Thenable, onRejected: (error: any) => Promise.Thenable, onProgress?: (note: any) => any): void; - done(onFulfilled: (value: T) => Promise.Thenable, onRejected?: (error: any) => U, onProgress?: (note: any) => any): void; - done(onFulfilled: (value: T) => U, onRejected: (error: any) => Promise.Thenable, onProgress?: (note: any) => any): void; + done(onFulfilled: (value: T) => PromiseLike, onRejected: (error: any) => PromiseLike, onProgress?: (note: any) => any): void; + done(onFulfilled: (value: T) => PromiseLike, onRejected?: (error: any) => U, onProgress?: (note: any) => any): void; + done(onFulfilled: (value: T) => U, onRejected: (error: any) => PromiseLike, onProgress?: (note: any) => any): void; done(onFulfilled?: (value: T) => U, onRejected?: (error: any) => U, onProgress?: (note: any) => any): void; /** * Like `.finally()`, but not called for rejections. */ - tap(onFulFill: (value: T) => Promise.Thenable): Promise; + tap(onFulFill: (value: T) => PromiseLike): Promise; tap(onFulfill: (value: T) => U): Promise; /** @@ -480,9 +480,9 @@ interface Promise extends Promise.Thenable, Promise.Inspection { /** * Like `.then()`, but cancellation of the the returned promise or any of its descendant will not propagate cancellation to this promise or this promise's ancestors. */ - fork(onFulfilled: (value: T) => Promise.Thenable, onRejected: (error: any) => Promise.Thenable, onProgress?: (note: any) => any): Promise; - fork(onFulfilled: (value: T) => Promise.Thenable, onRejected?: (error: any) => U, onProgress?: (note: any) => any): Promise; - fork(onFulfilled: (value: T) => U, onRejected: (error: any) => Promise.Thenable, onProgress?: (note: any) => any): Promise; + fork(onFulfilled: (value: T) => PromiseLike, onRejected: (error: any) => PromiseLike, onProgress?: (note: any) => any): Promise; + fork(onFulfilled: (value: T) => PromiseLike, onRejected?: (error: any) => U, onProgress?: (note: any) => any): Promise; + fork(onFulfilled: (value: T) => U, onRejected: (error: any) => PromiseLike, onProgress?: (note: any) => any): Promise; fork(onFulfilled?: (value: T) => U, onRejected?: (error: any) => U, onProgress?: (note: any) => any): Promise; /** @@ -604,13 +604,13 @@ interface Promise extends Promise.Thenable, Promise.Inspection { * Like calling `.then`, but the fulfillment value or rejection reason is assumed to be an array, which is flattened to the formal parameters of the handlers. */ // TODO how to model instance.spread()? like Q? - spread(onFulfill: Function, onReject?: (reason: any) => Promise.Thenable): Promise; + spread(onFulfill: Function, onReject?: (reason: any) => PromiseLike): Promise; spread(onFulfill: Function, onReject?: (reason: any) => U): Promise; /* // TODO or something like this? - spread(onFulfill: (...values: W[]) => Promise.Thenable, onReject?: (reason: any) => Promise.Thenable): Promise; - spread(onFulfill: (...values: W[]) => Promise.Thenable, onReject?: (reason: any) => U): Promise; - spread(onFulfill: (...values: W[]) => U, onReject?: (reason: any) => Promise.Thenable): Promise; + spread(onFulfill: (...values: W[]) => PromiseLike, onReject?: (reason: any) => PromiseLike): Promise; + spread(onFulfill: (...values: W[]) => PromiseLike, onReject?: (reason: any) => U): Promise; + spread(onFulfill: (...values: W[]) => U, onReject?: (reason: any) => PromiseLike): Promise; spread(onFulfill: (...values: W[]) => U, onReject?: (reason: any) => U): Promise; */ /** @@ -653,33 +653,33 @@ interface Promise extends Promise.Thenable, Promise.Inspection { * Same as calling `Promise.map(thisPromise, mapper)`. With the exception that if this promise is bound to a value, the returned promise is bound to that value too. */ // TODO type inference from array-resolving promise? - map(mapper: (item: Q, index: number, arrayLength: number) => Promise.Thenable, options?: Promise.ConcurrencyOption): Promise; + map(mapper: (item: Q, index: number, arrayLength: number) => PromiseLike, options?: Promise.ConcurrencyOption): Promise; map(mapper: (item: Q, index: number, arrayLength: number) => U, options?: Promise.ConcurrencyOption): Promise; /** * Same as `Promise.mapSeries(thisPromise, mapper)`. */ // TODO type inference from array-resolving promise? - mapSeries(mapper: (item: Q, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + mapSeries(mapper: (item: Q, index: number, arrayLength: number) => U | PromiseLike): Promise; /** * Same as calling `Promise.reduce(thisPromise, Function reducer, initialValue)`. With the exception that if this promise is bound to a value, the returned promise is bound to that value too. */ // TODO type inference from array-resolving promise? - reduce(reducer: (memo: U, item: Q, index: number, arrayLength: number) => Promise.Thenable, initialValue?: U): Promise; + reduce(reducer: (memo: U, item: Q, index: number, arrayLength: number) => PromiseLike, initialValue?: U): Promise; reduce(reducer: (memo: U, item: Q, index: number, arrayLength: number) => U, initialValue?: U): Promise; /** * Same as calling ``Promise.filter(thisPromise, filterer)``. With the exception that if this promise is bound to a value, the returned promise is bound to that value too. */ // TODO type inference from array-resolving promise? - filter(filterer: (item: U, index: number, arrayLength: number) => Promise.Thenable, options?: Promise.ConcurrencyOption): Promise; + filter(filterer: (item: U, index: number, arrayLength: number) => PromiseLike, options?: Promise.ConcurrencyOption): Promise; filter(filterer: (item: U, index: number, arrayLength: number) => boolean, options?: Promise.ConcurrencyOption): Promise; /** * Same as calling ``Promise.each(thisPromise, iterator)``. With the exception that if this promise is bound to a value, the returned promise is bound to that value too. */ - each(iterator: (item: T, index: number, arrayLength: number) => U | Promise.Thenable): Promise; + each(iterator: (item: T, index: number, arrayLength: number) => U | PromiseLike): Promise; } /** @@ -710,12 +710,7 @@ declare namespace Promise { suffix?: string; filter?: (name: string, func: Function, target?: any, passesDefaultFilter?: boolean) => boolean; // The promisifier gets a reference to the original method and should return a function which returns a promise - promisifier?: (originalMethod: Function) => () => Thenable; - } - - export interface Thenable { - then(onFulfilled: (value: T) => U | Thenable, onRejected?: (error: any) => U | Thenable): Thenable; - then(onFulfilled: (value: T) => U | Thenable, onRejected?: (error: any) => void | Thenable): Thenable; + promisifier?: (originalMethod: Function) => () => PromiseLike; } export interface Resolver {