The type of newPromise, based on the overload, is Promise<string>. However, because the onRejected function doesn't throw or return a rejected promise, newPromise becomes a resolved promise with the return value of onRejected, which is void, which means that newPromise should be Promise<T | void>. Specifically, this code should not compile:
newPromise.then((value: string) => {
// value should be `(string | void)`, since it could have a
//value from the `onRejected` branch
});
https://github.com/stefanpenner/es6-promise/blob/9869a4bc92c0372b9fc9e2dc3a9a1a861d91bbe0/es6-promise.d.ts#L3
One of the overloads for
Thenable.then
is:However, consider this example:
The type of
newPromise
, based on the overload, isPromise<string>
. However, because theonRejected
function doesn't throw or return a rejected promise,newPromise
becomes a resolved promise with the return value ofonRejected
, which isvoid
, which means thatnewPromise
should bePromise<T | void>
. Specifically, this code should not compile: