core-promise

/** * Represents the completion of an asynchronous operation */interfacePromise<T>{/** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. * @param onrejected The callback to execute when the Promise is rejected. * @returns A Promise for the completion of which ever callback is executed. */then<TResult>(onfulfilled?:(value:T)=>TResult|PromiseLike<TResult>,onrejected?:(reason:any)=>TResult|PromiseLike<TResult>)" Promise<TResult>;then<TResult>(onfulfilled?:(value:T)=>TResult|PromiseLike<TResult>,onrejected?:(reason:any)=>void):Promise<TResult>;/** * Attaches a callback for only the rejection of the Promise. * @param onrejected The callback to execute when the Promise is rejected. * @returns A Promise for the completion of the callback. */catch(onrejected?:(reason:any)=>T|PromiseLike<T>):Promise<T>;catch(onrejected?:(reason:any)=>void):Promise<T>;[Symbol.toStringTag]:string;}

Thus not only you have now all the test guarantees, you also get the API guarantees. Neat!