// @flow declare class ThenPromise<+R> extends Promise { constructor(callback: ( resolve: (result: Promise | R) => void, reject: (error: any) => void ) => mixed): void; then(onFulfill: null | void, onReject: null | void): ThenPromise; then( onFulfill: null | void, onReject: (error: any) => Promise | U ): ThenPromise; then( onFulfill: (value: R) => Promise | U, onReject: null | void | ((error: any) => Promise | U) ): ThenPromise; catch(onReject: null | void): ThenPromise; catch( onReject: (error: any) => Promise | U ): ThenPromise; // Extensions specific to then/promise /** * Attaches callbacks for the resolution and/or rejection of the ThenPromise, without returning a new promise. * @param onfulfilled The callback to execute when the ThenPromise is resolved. * @param onrejected The callback to execute when the ThenPromise is rejected. */ done(onfulfilled?: (value: R) => any, onrejected?: (reason: any) => any): void; /** * Calls a node.js style callback. If none is provided, the promise is returned. */ nodeify(callback: void | null): ThenPromise; nodeify(callback: (err: Error, value: R) => void): void; static resolve(object: Promise | T): ThenPromise; static reject(error?: any): ThenPromise; static all>(promises: T): ThenPromise<$TupleMap>; static race | T>(promises: Iterable): ThenPromise; // Extensions specific to then/promise static denodeify(fn: Function): (...args: any[]) => ThenPromise; static nodeify(fn: Function): Function; } module.exports = ThenPromise;