diff --git a/src/lib/es2015.promise.d.ts b/src/lib/es2015.promise.d.ts
index c5af984f7e022..e27da2ce11b6c 100644
--- a/src/lib/es2015.promise.d.ts
+++ b/src/lib/es2015.promise.d.ts
@@ -8,7 +8,7 @@ interface Promise<T> {
      * @param onrejected The callback to execute when the Promise is rejected.
      * @returns A Promise for the completion of which ever callback is executed.
      */
-    then<TResult1, TResult2>(onfulfilled: (value: T) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>;
+    then(onfulfilled?: ((value: T) => T | PromiseLike<T>) | undefined | null, onrejected?: ((reason: any) => T | PromiseLike<T>) | undefined | null): Promise<T>;
 
     /**
      * Attaches callbacks for the resolution and/or rejection of the Promise.
@@ -16,34 +16,37 @@ interface Promise<T> {
      * @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) => T | PromiseLike<T>) | undefined | null, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<T | TResult>;
 
     /**
      * 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>): Promise<TResult>;
+    then<TResult>(onfulfilled: (value: T) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<TResult>;
 
     /**
-     * Creates a new Promise with the same internal state of this Promise.
-     * @returns A Promise.
+     * 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(): Promise<T>;
+    then<TResult1, TResult2>(onfulfilled: (value: T) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>;
 
     /**
      * 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<TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<T | TResult>;
+    catch(onrejected?: ((reason: any) => T | PromiseLike<T>) | undefined | null): Promise<T>;
 
     /**
      * 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<TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<T | TResult>;
 }
 
 interface PromiseConstructor {
@@ -140,6 +143,86 @@ interface PromiseConstructor {
      */
     all<T>(values: (T | PromiseLike<T>)[]): Promise<T[]>;
 
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>, T10 | PromiseLike<T10>]): Promise<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>]): Promise<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>]): Promise<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2, T3, T4, T5, T6, T7>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>]): Promise<T1 | T2 | T3 | T4 | T5 | T6 | T7>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2, T3, T4, T5, T6>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>]): Promise<T1 | T2 | T3 | T4 | T5 | T6>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2, T3, T4, T5>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>]): Promise<T1 | T2 | T3 | T4 | T5>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2, T3, T4>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>]): Promise<T1 | T2 | T3 | T4>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<T1 | T2 | T3>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<T1 | T2>;
+
+    /**
+     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
+     * or rejected.
+     * @param values An array of Promises.
+     * @returns A new Promise.
+     */
+    race<T>(values: (T | PromiseLike<T>)[]): Promise<T>;
+
     /**
      * Creates a new rejected promise for the provided reason.
      * @param reason The reason the promise was rejected.
diff --git a/src/lib/es5.d.ts b/src/lib/es5.d.ts
index e4cbe323c681a..e54043fdbdf43 100644
--- a/src/lib/es5.d.ts
+++ b/src/lib/es5.d.ts
@@ -1265,13 +1265,44 @@ declare type PromiseConstructorLike = new <T>(executor: (resolve: (value?: T | P
 
 interface PromiseLike<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>): PromiseLike<TResult>;
-    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): PromiseLike<TResult>;
+     * 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(
+        onfulfilled?: ((value: T) => T | PromiseLike<T>) | undefined | null,
+        onrejected?: ((reason: any) => T | PromiseLike<T>) | undefined | null): PromiseLike<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) => T | PromiseLike<T>) | undefined | null,
+        onrejected: (reason: any) => TResult | PromiseLike<TResult>): PromiseLike<T | TResult>;
+
+    /**
+     * 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>) | undefined | null): PromiseLike<TResult>;
+
+    /**
+     * 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<TResult1, TResult2>(
+        onfulfilled: (value: T) => TResult1 | PromiseLike<TResult1>,
+        onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): PromiseLike<TResult1 | TResult2>;
 }
 
 interface ArrayLike<T> {
diff --git a/tests/baselines/reference/inferenceLimit.types b/tests/baselines/reference/inferenceLimit.types
index 37b51e49644a8..4c7566f5786dd 100644
--- a/tests/baselines/reference/inferenceLimit.types
+++ b/tests/baselines/reference/inferenceLimit.types
@@ -46,7 +46,7 @@ export class BrokenClass {
 
         this.doStuff(order.id)
 >this.doStuff(order.id)          .then((items) => {            order.items = items;            resolve(order);          }) : Promise<void>
->this.doStuff(order.id)          .then : { <TResult1, TResult2>(onfulfilled: (value: void) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: void) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: void) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<void>; }
+>this.doStuff(order.id)          .then : { (onfulfilled?: (value: void) => void | PromiseLike<void>, onrejected?: (reason: any) => void | PromiseLike<void>): Promise<void>; <TResult>(onfulfilled: (value: void) => void | PromiseLike<void>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<void | TResult>; <TResult>(onfulfilled: (value: void) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: void) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >this.doStuff(order.id) : Promise<void>
 >this.doStuff : (id: number) => Promise<void>
 >this : this
@@ -56,7 +56,7 @@ export class BrokenClass {
 >id : any
 
           .then((items) => {
->then : { <TResult1, TResult2>(onfulfilled: (value: void) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: void) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: void) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<void>; }
+>then : { (onfulfilled?: (value: void) => void | PromiseLike<void>, onrejected?: (reason: any) => void | PromiseLike<void>): Promise<void>; <TResult>(onfulfilled: (value: void) => void | PromiseLike<void>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<void | TResult>; <TResult>(onfulfilled: (value: void) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: void) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >(items) => {            order.items = items;            resolve(order);          } : (items: void) => void
 >items : void
 
@@ -78,7 +78,7 @@ export class BrokenClass {
 
     return Promise.all(result.map(populateItems))
 >Promise.all(result.map(populateItems))      .then((orders: Array<MyModule.MyModel>) => {        resolve(orders);      }) : Promise<void>
->Promise.all(result.map(populateItems))      .then : { <TResult1, TResult2>(onfulfilled: (value: {}[]) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: {}[]) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: {}[]) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<{}[]>; }
+>Promise.all(result.map(populateItems))      .then : { (onfulfilled?: (value: {}[]) => {}[] | PromiseLike<{}[]>, onrejected?: (reason: any) => {}[] | PromiseLike<{}[]>): Promise<{}[]>; <TResult>(onfulfilled: (value: {}[]) => {}[] | PromiseLike<{}[]>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<{}[] | TResult>; <TResult>(onfulfilled: (value: {}[]) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: {}[]) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >Promise.all(result.map(populateItems)) : Promise<{}[]>
 >Promise.all : { <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>, T10 | PromiseLike<T10>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; <T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>, T9 | PromiseLike<T9>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; <T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>, T8 | PromiseLike<T8>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>; <T1, T2, T3, T4, T5, T6, T7>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>, T7 | PromiseLike<T7>]): Promise<[T1, T2, T3, T4, T5, T6, T7]>; <T1, T2, T3, T4, T5, T6>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>, T6 | PromiseLike<T6>]): Promise<[T1, T2, T3, T4, T5, T6]>; <T1, T2, T3, T4, T5>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>, T5 | PromiseLike<T5>]): Promise<[T1, T2, T3, T4, T5]>; <T1, T2, T3, T4>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>, T4 | PromiseLike<T4>]): Promise<[T1, T2, T3, T4]>; <T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>; <T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<[T1, T2]>; <T>(values: (T | PromiseLike<T>)[]): Promise<T[]>; <TAll>(values: Iterable<TAll | PromiseLike<TAll>>): Promise<TAll[]>; }
 >Promise : PromiseConstructor
@@ -90,7 +90,7 @@ export class BrokenClass {
 >populateItems : (order: any) => Promise<{}>
 
       .then((orders: Array<MyModule.MyModel>) => {
->then : { <TResult1, TResult2>(onfulfilled: (value: {}[]) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: {}[]) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: {}[]) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<{}[]>; }
+>then : { (onfulfilled?: (value: {}[]) => {}[] | PromiseLike<{}[]>, onrejected?: (reason: any) => {}[] | PromiseLike<{}[]>): Promise<{}[]>; <TResult>(onfulfilled: (value: {}[]) => {}[] | PromiseLike<{}[]>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<{}[] | TResult>; <TResult>(onfulfilled: (value: {}[]) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: {}[]) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >(orders: Array<MyModule.MyModel>) => {        resolve(orders);      } : (orders: MyModule.MyModel[]) => void
 >orders : MyModule.MyModel[]
 >Array : T[]
diff --git a/tests/baselines/reference/modularizeLibrary_NoErrorDuplicateLibOptions1.types b/tests/baselines/reference/modularizeLibrary_NoErrorDuplicateLibOptions1.types
index 3851714cad8fc..34940e6c9aa40 100644
--- a/tests/baselines/reference/modularizeLibrary_NoErrorDuplicateLibOptions1.types
+++ b/tests/baselines/reference/modularizeLibrary_NoErrorDuplicateLibOptions1.types
@@ -148,10 +148,10 @@ declare var console: any;
 
 out().then(() => {
 >out().then(() => {    console.log("Yea!");}) : Promise<void>
->out().then : { <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<{}>; }
+>out().then : { (onfulfilled?: (value: {}) => {} | PromiseLike<{}>, onrejected?: (reason: any) => {} | PromiseLike<{}>): Promise<{}>; <TResult>(onfulfilled: (value: {}) => {} | PromiseLike<{}>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<{} | TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >out() : Promise<{}>
 >out : () => Promise<{}>
->then : { <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<{}>; }
+>then : { (onfulfilled?: (value: {}) => {} | PromiseLike<{}>, onrejected?: (reason: any) => {} | PromiseLike<{}>): Promise<{}>; <TResult>(onfulfilled: (value: {}) => {} | PromiseLike<{}>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<{} | TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >() => {    console.log("Yea!");} : () => void
 
     console.log("Yea!");
diff --git a/tests/baselines/reference/modularizeLibrary_NoErrorDuplicateLibOptions2.types b/tests/baselines/reference/modularizeLibrary_NoErrorDuplicateLibOptions2.types
index f9c1894f86f19..f6821829561c8 100644
--- a/tests/baselines/reference/modularizeLibrary_NoErrorDuplicateLibOptions2.types
+++ b/tests/baselines/reference/modularizeLibrary_NoErrorDuplicateLibOptions2.types
@@ -148,10 +148,10 @@ declare var console: any;
 
 out().then(() => {
 >out().then(() => {    console.log("Yea!");}) : Promise<void>
->out().then : { <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<{}>; }
+>out().then : { (onfulfilled?: (value: {}) => {} | PromiseLike<{}>, onrejected?: (reason: any) => {} | PromiseLike<{}>): Promise<{}>; <TResult>(onfulfilled: (value: {}) => {} | PromiseLike<{}>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<{} | TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >out() : Promise<{}>
 >out : () => Promise<{}>
->then : { <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<{}>; }
+>then : { (onfulfilled?: (value: {}) => {} | PromiseLike<{}>, onrejected?: (reason: any) => {} | PromiseLike<{}>): Promise<{}>; <TResult>(onfulfilled: (value: {}) => {} | PromiseLike<{}>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<{} | TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >() => {    console.log("Yea!");} : () => void
 
     console.log("Yea!");
diff --git a/tests/baselines/reference/modularizeLibrary_TargetES5UsingES6Lib.types b/tests/baselines/reference/modularizeLibrary_TargetES5UsingES6Lib.types
index 8728176c2c1d0..ab57771a47963 100644
--- a/tests/baselines/reference/modularizeLibrary_TargetES5UsingES6Lib.types
+++ b/tests/baselines/reference/modularizeLibrary_TargetES5UsingES6Lib.types
@@ -148,10 +148,10 @@ declare var console: any;
 
 out().then(() => {
 >out().then(() => {    console.log("Yea!");}) : Promise<void>
->out().then : { <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<{}>; }
+>out().then : { (onfulfilled?: (value: {}) => {} | PromiseLike<{}>, onrejected?: (reason: any) => {} | PromiseLike<{}>): Promise<{}>; <TResult>(onfulfilled: (value: {}) => {} | PromiseLike<{}>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<{} | TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >out() : Promise<{}>
 >out : () => Promise<{}>
->then : { <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<{}>; }
+>then : { (onfulfilled?: (value: {}) => {} | PromiseLike<{}>, onrejected?: (reason: any) => {} | PromiseLike<{}>): Promise<{}>; <TResult>(onfulfilled: (value: {}) => {} | PromiseLike<{}>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<{} | TResult>; <TResult>(onfulfilled: (value: {}) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: {}) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >() => {    console.log("Yea!");} : () => void
 
     console.log("Yea!");
diff --git a/tests/baselines/reference/promiseType.js b/tests/baselines/reference/promiseType.js
index 6b8d292a2b0e7..fc49dda9db45a 100644
--- a/tests/baselines/reference/promiseType.js
+++ b/tests/baselines/reference/promiseType.js
@@ -91,7 +91,69 @@ async function I() {
     catch (e) {
         return Promise.reject(Error());
     }
-}
+}
+
+// addresses github issue #4903:
+
+const p00 = p.catch();
+const p01 = p.catch(undefined);
+const p07 = p.catch(null);
+const p02 = p.catch(() => 1);
+const p03 = p.catch(() => {});
+const p04 = p.catch(() => {throw 1});
+const p05 = p.catch(() => Promise.reject(1));
+const p06 = p.catch(() => Promise.resolve(1));
+
+const p10 = p.then();
+
+const p20 = p.then(undefined);
+const p21 = p.then(() => 1);
+const p22 = p.then(() => {});
+const p23 = p.then(() => {throw 1});
+const p24 = p.then(() => Promise.resolve(1));
+const p25 = p.then(() => Promise.reject(1));
+
+const p30 = p.then(undefined, undefined);
+const p31 = p.then(undefined, () => 1);
+const p32 = p.then(undefined, () => {});
+const p33 = p.then(undefined, () => {throw 1});
+const p34 = p.then(undefined, () => Promise.resolve(1));
+const p35 = p.then(undefined, () => Promise.reject(1));
+
+const p40 = p.then(() => "1", undefined);
+const p41 = p.then(() => "1", () => 1);
+const p42 = p.then(() => "1", () => {});
+const p43 = p.then(() => "1", () => {throw 1});
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+const p45 = p.then(() => "1", () => Promise.reject(1));
+
+const p50 = p.then(() => {}, undefined);
+const p51 = p.then(() => {}, () => 1);
+const p52 = p.then(() => {}, () => {});
+const p53 = p.then(() => {}, () => {throw 1});
+const p54 = p.then(() => {}, () => Promise.resolve(1));
+const p55 = p.then(() => {}, () => Promise.reject(1));
+
+const p60 = p.then(() => {throw 1}, undefined);
+const p61 = p.then(() => {throw 1}, () => 1);
+const p62 = p.then(() => {throw 1}, () => {});
+const p63 = p.then(() => {throw 1}, () => {throw 1});
+const p64 = p.then(() => {throw 1}, () => Promise.resolve(1));
+const p65 = p.then(() => {throw 1}, () => Promise.reject(1));
+
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+const p72 = p.then(() => Promise.resolve("1"), () => {});
+const p73 = p.then(() => Promise.resolve("1"), () => {throw 1});
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+
+const p80 = p.then(() => Promise.reject(1), undefined);
+const p81 = p.then(() => Promise.reject(1), () => 1);
+const p82 = p.then(() => Promise.reject(1), () => {});
+const p83 = p.then(() => Promise.reject(1), () => {throw 1});
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
 
 //// [promiseType.js]
 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -200,3 +262,55 @@ function I() {
         }
     });
 }
+// addresses github issue #4903:
+const p00 = p.catch();
+const p01 = p.catch(undefined);
+const p07 = p.catch(null);
+const p02 = p.catch(() => 1);
+const p03 = p.catch(() => { });
+const p04 = p.catch(() => { throw 1; });
+const p05 = p.catch(() => Promise.reject(1));
+const p06 = p.catch(() => Promise.resolve(1));
+const p10 = p.then();
+const p20 = p.then(undefined);
+const p21 = p.then(() => 1);
+const p22 = p.then(() => { });
+const p23 = p.then(() => { throw 1; });
+const p24 = p.then(() => Promise.resolve(1));
+const p25 = p.then(() => Promise.reject(1));
+const p30 = p.then(undefined, undefined);
+const p31 = p.then(undefined, () => 1);
+const p32 = p.then(undefined, () => { });
+const p33 = p.then(undefined, () => { throw 1; });
+const p34 = p.then(undefined, () => Promise.resolve(1));
+const p35 = p.then(undefined, () => Promise.reject(1));
+const p40 = p.then(() => "1", undefined);
+const p41 = p.then(() => "1", () => 1);
+const p42 = p.then(() => "1", () => { });
+const p43 = p.then(() => "1", () => { throw 1; });
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+const p45 = p.then(() => "1", () => Promise.reject(1));
+const p50 = p.then(() => { }, undefined);
+const p51 = p.then(() => { }, () => 1);
+const p52 = p.then(() => { }, () => { });
+const p53 = p.then(() => { }, () => { throw 1; });
+const p54 = p.then(() => { }, () => Promise.resolve(1));
+const p55 = p.then(() => { }, () => Promise.reject(1));
+const p60 = p.then(() => { throw 1; }, undefined);
+const p61 = p.then(() => { throw 1; }, () => 1);
+const p62 = p.then(() => { throw 1; }, () => { });
+const p63 = p.then(() => { throw 1; }, () => { throw 1; });
+const p64 = p.then(() => { throw 1; }, () => Promise.resolve(1));
+const p65 = p.then(() => { throw 1; }, () => Promise.reject(1));
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+const p72 = p.then(() => Promise.resolve("1"), () => { });
+const p73 = p.then(() => Promise.resolve("1"), () => { throw 1; });
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+const p80 = p.then(() => Promise.reject(1), undefined);
+const p81 = p.then(() => Promise.reject(1), () => 1);
+const p82 = p.then(() => Promise.reject(1), () => { });
+const p83 = p.then(() => Promise.reject(1), () => { throw 1; });
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
diff --git a/tests/baselines/reference/promiseType.symbols b/tests/baselines/reference/promiseType.symbols
index fde4cf4f6f2fe..845aed26d5e32 100644
--- a/tests/baselines/reference/promiseType.symbols
+++ b/tests/baselines/reference/promiseType.symbols
@@ -231,3 +231,410 @@ async function I() {
 >Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
     }
 }
+
+// addresses github issue #4903:
+
+const p00 = p.catch();
+>p00 : Symbol(p00, Decl(promiseType.ts, 96, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p01 = p.catch(undefined);
+>p01 : Symbol(p01, Decl(promiseType.ts, 97, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p07 = p.catch(null);
+>p07 : Symbol(p07, Decl(promiseType.ts, 98, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p02 = p.catch(() => 1);
+>p02 : Symbol(p02, Decl(promiseType.ts, 99, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p03 = p.catch(() => {});
+>p03 : Symbol(p03, Decl(promiseType.ts, 100, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p04 = p.catch(() => {throw 1});
+>p04 : Symbol(p04, Decl(promiseType.ts, 101, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p05 = p.catch(() => Promise.reject(1));
+>p05 : Symbol(p05, Decl(promiseType.ts, 102, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p06 = p.catch(() => Promise.resolve(1));
+>p06 : Symbol(p06, Decl(promiseType.ts, 103, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p10 = p.then();
+>p10 : Symbol(p10, Decl(promiseType.ts, 105, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p20 = p.then(undefined);
+>p20 : Symbol(p20, Decl(promiseType.ts, 107, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p21 = p.then(() => 1);
+>p21 : Symbol(p21, Decl(promiseType.ts, 108, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p22 = p.then(() => {});
+>p22 : Symbol(p22, Decl(promiseType.ts, 109, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p23 = p.then(() => {throw 1});
+>p23 : Symbol(p23, Decl(promiseType.ts, 110, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p24 = p.then(() => Promise.resolve(1));
+>p24 : Symbol(p24, Decl(promiseType.ts, 111, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p25 = p.then(() => Promise.reject(1));
+>p25 : Symbol(p25, Decl(promiseType.ts, 112, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p30 = p.then(undefined, undefined);
+>p30 : Symbol(p30, Decl(promiseType.ts, 114, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+>undefined : Symbol(undefined)
+
+const p31 = p.then(undefined, () => 1);
+>p31 : Symbol(p31, Decl(promiseType.ts, 115, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p32 = p.then(undefined, () => {});
+>p32 : Symbol(p32, Decl(promiseType.ts, 116, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p33 = p.then(undefined, () => {throw 1});
+>p33 : Symbol(p33, Decl(promiseType.ts, 117, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p34 = p.then(undefined, () => Promise.resolve(1));
+>p34 : Symbol(p34, Decl(promiseType.ts, 118, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p35 = p.then(undefined, () => Promise.reject(1));
+>p35 : Symbol(p35, Decl(promiseType.ts, 119, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p40 = p.then(() => "1", undefined);
+>p40 : Symbol(p40, Decl(promiseType.ts, 121, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p41 = p.then(() => "1", () => 1);
+>p41 : Symbol(p41, Decl(promiseType.ts, 122, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p42 = p.then(() => "1", () => {});
+>p42 : Symbol(p42, Decl(promiseType.ts, 123, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p43 = p.then(() => "1", () => {throw 1});
+>p43 : Symbol(p43, Decl(promiseType.ts, 124, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+>p44 : Symbol(p44, Decl(promiseType.ts, 125, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p45 = p.then(() => "1", () => Promise.reject(1));
+>p45 : Symbol(p45, Decl(promiseType.ts, 126, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p50 = p.then(() => {}, undefined);
+>p50 : Symbol(p50, Decl(promiseType.ts, 128, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p51 = p.then(() => {}, () => 1);
+>p51 : Symbol(p51, Decl(promiseType.ts, 129, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p52 = p.then(() => {}, () => {});
+>p52 : Symbol(p52, Decl(promiseType.ts, 130, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p53 = p.then(() => {}, () => {throw 1});
+>p53 : Symbol(p53, Decl(promiseType.ts, 131, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p54 = p.then(() => {}, () => Promise.resolve(1));
+>p54 : Symbol(p54, Decl(promiseType.ts, 132, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p55 = p.then(() => {}, () => Promise.reject(1));
+>p55 : Symbol(p55, Decl(promiseType.ts, 133, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p60 = p.then(() => {throw 1}, undefined);
+>p60 : Symbol(p60, Decl(promiseType.ts, 135, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p61 = p.then(() => {throw 1}, () => 1);
+>p61 : Symbol(p61, Decl(promiseType.ts, 136, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p62 = p.then(() => {throw 1}, () => {});
+>p62 : Symbol(p62, Decl(promiseType.ts, 137, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p63 = p.then(() => {throw 1}, () => {throw 1});
+>p63 : Symbol(p63, Decl(promiseType.ts, 138, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p64 = p.then(() => {throw 1}, () => Promise.resolve(1));
+>p64 : Symbol(p64, Decl(promiseType.ts, 139, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p65 = p.then(() => {throw 1}, () => Promise.reject(1));
+>p65 : Symbol(p65, Decl(promiseType.ts, 140, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+>p70 : Symbol(p70, Decl(promiseType.ts, 142, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+>p71 : Symbol(p71, Decl(promiseType.ts, 143, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p72 = p.then(() => Promise.resolve("1"), () => {});
+>p72 : Symbol(p72, Decl(promiseType.ts, 144, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p73 = p.then(() => Promise.resolve("1"), () => {throw 1});
+>p73 : Symbol(p73, Decl(promiseType.ts, 145, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+>p74 : Symbol(p74, Decl(promiseType.ts, 146, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+>p75 : Symbol(p75, Decl(promiseType.ts, 147, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p80 = p.then(() => Promise.reject(1), undefined);
+>p80 : Symbol(p80, Decl(promiseType.ts, 149, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p81 = p.then(() => Promise.reject(1), () => 1);
+>p81 : Symbol(p81, Decl(promiseType.ts, 150, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p82 = p.then(() => Promise.reject(1), () => {});
+>p82 : Symbol(p82, Decl(promiseType.ts, 151, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p83 = p.then(() => Promise.reject(1), () => {throw 1});
+>p83 : Symbol(p83, Decl(promiseType.ts, 152, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+>p84 : Symbol(p84, Decl(promiseType.ts, 153, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
+>p85 : Symbol(p85, Decl(promiseType.ts, 154, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseType.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
diff --git a/tests/baselines/reference/promiseType.types b/tests/baselines/reference/promiseType.types
index 1608182d6e9fd..ec4db3cabe9f8 100644
--- a/tests/baselines/reference/promiseType.types
+++ b/tests/baselines/reference/promiseType.types
@@ -6,16 +6,16 @@ declare var p: Promise<boolean>;
 const a = p.then();
 >a : Promise<boolean>
 >p.then() : Promise<boolean>
->p.then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >p : Promise<boolean>
->then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 
 const b = p.then(b => 1);
 >b : Promise<number>
 >p.then(b => 1) : Promise<number>
->p.then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >p : Promise<boolean>
->then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >b => 1 : (b: boolean) => number
 >b : boolean
 >1 : number
@@ -23,9 +23,9 @@ const b = p.then(b => 1);
 const c = p.then(b => 1, e => 'error');
 >c : Promise<string | number>
 >p.then(b => 1, e => 'error') : Promise<string | number>
->p.then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >p : Promise<boolean>
->then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >b => 1 : (b: boolean) => number
 >b : boolean
 >1 : number
@@ -36,9 +36,9 @@ const c = p.then(b => 1, e => 'error');
 const d = p.then(b => 1, e => { });
 >d : Promise<number | void>
 >p.then(b => 1, e => { }) : Promise<number | void>
->p.then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >p : Promise<boolean>
->then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >b => 1 : (b: boolean) => number
 >b : boolean
 >1 : number
@@ -48,9 +48,9 @@ const d = p.then(b => 1, e => { });
 const e = p.then(b => 1, e => { throw Error(); });
 >e : Promise<number>
 >p.then(b => 1, e => { throw Error(); }) : Promise<number>
->p.then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >p : Promise<boolean>
->then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >b => 1 : (b: boolean) => number
 >b : boolean
 >1 : number
@@ -62,9 +62,9 @@ const e = p.then(b => 1, e => { throw Error(); });
 const f = p.then(b => 1, e => Promise.reject(Error()));
 >f : Promise<number>
 >p.then(b => 1, e => Promise.reject(Error())) : Promise<number>
->p.then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >p : Promise<boolean>
->then : { <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<boolean>; }
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >b => 1 : (b: boolean) => number
 >b : boolean
 >1 : number
@@ -80,9 +80,9 @@ const f = p.then(b => 1, e => Promise.reject(Error()));
 const g = p.catch(e => 'error');
 >g : Promise<string | boolean>
 >p.catch(e => 'error') : Promise<string | boolean>
->p.catch : { <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; (onrejected: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; }
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
 >p : Promise<boolean>
->catch : { <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; (onrejected: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; }
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
 >e => 'error' : (e: any) => string
 >e : any
 >'error' : string
@@ -90,18 +90,18 @@ const g = p.catch(e => 'error');
 const h = p.catch(e => { });
 >h : Promise<boolean | void>
 >p.catch(e => { }) : Promise<boolean | void>
->p.catch : { <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; (onrejected: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; }
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
 >p : Promise<boolean>
->catch : { <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; (onrejected: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; }
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
 >e => { } : (e: any) => void
 >e : any
 
 const i = p.catch(e => { throw Error(); });
 >i : Promise<boolean>
 >p.catch(e => { throw Error(); }) : Promise<boolean>
->p.catch : { <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; (onrejected: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; }
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
 >p : Promise<boolean>
->catch : { <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; (onrejected: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; }
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
 >e => { throw Error(); } : (e: any) => never
 >e : any
 >Error() : Error
@@ -110,9 +110,9 @@ const i = p.catch(e => { throw Error(); });
 const j = p.catch(e => Promise.reject(Error()));
 >j : Promise<boolean>
 >p.catch(e => Promise.reject(Error())) : Promise<boolean>
->p.catch : { <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; (onrejected: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; }
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
 >p : Promise<boolean>
->catch : { <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; (onrejected: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; }
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
 >e => Promise.reject(Error()) : (e: any) => Promise<never>
 >e : any
 >Promise.reject(Error()) : Promise<never>
@@ -285,3 +285,616 @@ async function I() {
 >Error : ErrorConstructor
     }
 }
+
+// addresses github issue #4903:
+
+const p00 = p.catch();
+>p00 : Promise<boolean>
+>p.catch() : Promise<boolean>
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+
+const p01 = p.catch(undefined);
+>p01 : Promise<boolean>
+>p.catch(undefined) : Promise<boolean>
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>undefined : undefined
+
+const p07 = p.catch(null);
+>p07 : Promise<boolean>
+>p.catch(null) : Promise<boolean>
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>null : null
+
+const p02 = p.catch(() => 1);
+>p02 : Promise<number | boolean>
+>p.catch(() => 1) : Promise<number | boolean>
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => 1 : () => number
+>1 : number
+
+const p03 = p.catch(() => {});
+>p03 : Promise<boolean | void>
+>p.catch(() => {}) : Promise<boolean | void>
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => {} : () => void
+
+const p04 = p.catch(() => {throw 1});
+>p04 : Promise<boolean>
+>p.catch(() => {throw 1}) : Promise<boolean>
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => {throw 1} : () => never
+>1 : number
+
+const p05 = p.catch(() => Promise.reject(1));
+>p05 : Promise<boolean>
+>p.catch(() => Promise.reject(1)) : Promise<boolean>
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p06 = p.catch(() => Promise.resolve(1));
+>p06 : Promise<number | boolean>
+>p.catch(() => Promise.resolve(1)) : Promise<number | boolean>
+>p.catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p10 = p.then();
+>p10 : Promise<boolean>
+>p.then() : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+
+const p20 = p.then(undefined);
+>p20 : Promise<boolean>
+>p.then(undefined) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+
+const p21 = p.then(() => 1);
+>p21 : Promise<number>
+>p.then(() => 1) : Promise<number>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => 1 : () => number
+>1 : number
+
+const p22 = p.then(() => {});
+>p22 : Promise<void>
+>p.then(() => {}) : Promise<void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+
+const p23 = p.then(() => {throw 1});
+>p23 : Promise<boolean>
+>p.then(() => {throw 1}) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+
+const p24 = p.then(() => Promise.resolve(1));
+>p24 : Promise<number>
+>p.then(() => Promise.resolve(1)) : Promise<number>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p25 = p.then(() => Promise.reject(1));
+>p25 : Promise<boolean>
+>p.then(() => Promise.reject(1)) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p30 = p.then(undefined, undefined);
+>p30 : Promise<boolean>
+>p.then(undefined, undefined) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>undefined : undefined
+
+const p31 = p.then(undefined, () => 1);
+>p31 : Promise<number | boolean>
+>p.then(undefined, () => 1) : Promise<number | boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => 1 : () => number
+>1 : number
+
+const p32 = p.then(undefined, () => {});
+>p32 : Promise<boolean | void>
+>p.then(undefined, () => {}) : Promise<boolean | void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => {} : () => void
+
+const p33 = p.then(undefined, () => {throw 1});
+>p33 : Promise<boolean>
+>p.then(undefined, () => {throw 1}) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => {throw 1} : () => never
+>1 : number
+
+const p34 = p.then(undefined, () => Promise.resolve(1));
+>p34 : Promise<number | boolean>
+>p.then(undefined, () => Promise.resolve(1)) : Promise<number | boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p35 = p.then(undefined, () => Promise.reject(1));
+>p35 : Promise<boolean>
+>p.then(undefined, () => Promise.reject(1)) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p40 = p.then(() => "1", undefined);
+>p40 : Promise<string>
+>p.then(() => "1", undefined) : Promise<string>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>undefined : undefined
+
+const p41 = p.then(() => "1", () => 1);
+>p41 : Promise<string | number>
+>p.then(() => "1", () => 1) : Promise<string | number>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => 1 : () => number
+>1 : number
+
+const p42 = p.then(() => "1", () => {});
+>p42 : Promise<string | void>
+>p.then(() => "1", () => {}) : Promise<string | void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => {} : () => void
+
+const p43 = p.then(() => "1", () => {throw 1});
+>p43 : Promise<string>
+>p.then(() => "1", () => {throw 1}) : Promise<string>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => {throw 1} : () => never
+>1 : number
+
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+>p44 : Promise<string | number>
+>p.then(() => "1", () => Promise.resolve(1)) : Promise<string | number>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p45 = p.then(() => "1", () => Promise.reject(1));
+>p45 : Promise<string>
+>p.then(() => "1", () => Promise.reject(1)) : Promise<string>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p50 = p.then(() => {}, undefined);
+>p50 : Promise<void>
+>p.then(() => {}, undefined) : Promise<void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>undefined : undefined
+
+const p51 = p.then(() => {}, () => 1);
+>p51 : Promise<number | void>
+>p.then(() => {}, () => 1) : Promise<number | void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => 1 : () => number
+>1 : number
+
+const p52 = p.then(() => {}, () => {});
+>p52 : Promise<void>
+>p.then(() => {}, () => {}) : Promise<void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => {} : () => void
+
+const p53 = p.then(() => {}, () => {throw 1});
+>p53 : Promise<void>
+>p.then(() => {}, () => {throw 1}) : Promise<void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => {throw 1} : () => never
+>1 : number
+
+const p54 = p.then(() => {}, () => Promise.resolve(1));
+>p54 : Promise<number | void>
+>p.then(() => {}, () => Promise.resolve(1)) : Promise<number | void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p55 = p.then(() => {}, () => Promise.reject(1));
+>p55 : Promise<void>
+>p.then(() => {}, () => Promise.reject(1)) : Promise<void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p60 = p.then(() => {throw 1}, undefined);
+>p60 : Promise<boolean>
+>p.then(() => {throw 1}, undefined) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>undefined : undefined
+
+const p61 = p.then(() => {throw 1}, () => 1);
+>p61 : Promise<number | boolean>
+>p.then(() => {throw 1}, () => 1) : Promise<number | boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => 1 : () => number
+>1 : number
+
+const p62 = p.then(() => {throw 1}, () => {});
+>p62 : Promise<boolean | void>
+>p.then(() => {throw 1}, () => {}) : Promise<boolean | void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => {} : () => void
+
+const p63 = p.then(() => {throw 1}, () => {throw 1});
+>p63 : Promise<boolean>
+>p.then(() => {throw 1}, () => {throw 1}) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => {throw 1} : () => never
+>1 : number
+
+const p64 = p.then(() => {throw 1}, () => Promise.resolve(1));
+>p64 : Promise<number | boolean>
+>p.then(() => {throw 1}, () => Promise.resolve(1)) : Promise<number | boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p65 = p.then(() => {throw 1}, () => Promise.reject(1));
+>p65 : Promise<boolean>
+>p.then(() => {throw 1}, () => Promise.reject(1)) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+>p70 : Promise<string>
+>p.then(() => Promise.resolve("1"), undefined) : Promise<string>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>undefined : undefined
+
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+>p71 : Promise<string | number>
+>p.then(() => Promise.resolve("1"), () => 1) : Promise<string | number>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => 1 : () => number
+>1 : number
+
+const p72 = p.then(() => Promise.resolve("1"), () => {});
+>p72 : Promise<string | void>
+>p.then(() => Promise.resolve("1"), () => {}) : Promise<string | void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => {} : () => void
+
+const p73 = p.then(() => Promise.resolve("1"), () => {throw 1});
+>p73 : Promise<string>
+>p.then(() => Promise.resolve("1"), () => {throw 1}) : Promise<string>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => {throw 1} : () => never
+>1 : number
+
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+>p74 : Promise<string | number>
+>p.then(() => Promise.resolve("1"), () => Promise.resolve(1)) : Promise<string | number>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+>p75 : Promise<string>
+>p.then(() => Promise.resolve("1"), () => Promise.reject(1)) : Promise<string>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p80 = p.then(() => Promise.reject(1), undefined);
+>p80 : Promise<boolean>
+>p.then(() => Promise.reject(1), undefined) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>undefined : undefined
+
+const p81 = p.then(() => Promise.reject(1), () => 1);
+>p81 : Promise<number | boolean>
+>p.then(() => Promise.reject(1), () => 1) : Promise<number | boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => 1 : () => number
+>1 : number
+
+const p82 = p.then(() => Promise.reject(1), () => {});
+>p82 : Promise<boolean | void>
+>p.then(() => Promise.reject(1), () => {}) : Promise<boolean | void>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => {} : () => void
+
+const p83 = p.then(() => Promise.reject(1), () => {throw 1});
+>p83 : Promise<boolean>
+>p.then(() => Promise.reject(1), () => {throw 1}) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => {throw 1} : () => never
+>1 : number
+
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+>p84 : Promise<number | boolean>
+>p.then(() => Promise.reject(1), () => Promise.resolve(1)) : Promise<number | boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
+>p85 : Promise<boolean>
+>p.then(() => Promise.reject(1), () => Promise.reject(1)) : Promise<boolean>
+>p.then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: (value: boolean) => boolean | PromiseLike<boolean>, onrejected?: (reason: any) => boolean | PromiseLike<boolean>): Promise<boolean>; <TResult>(onfulfilled: (value: boolean) => boolean | PromiseLike<boolean>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
diff --git a/tests/baselines/reference/promiseTypeStrictNull.js b/tests/baselines/reference/promiseTypeStrictNull.js
new file mode 100644
index 0000000000000..cba4f7735ce3c
--- /dev/null
+++ b/tests/baselines/reference/promiseTypeStrictNull.js
@@ -0,0 +1,316 @@
+//// [promiseTypeStrictNull.ts]
+declare var p: Promise<boolean>;
+
+const a = p.then();
+const b = p.then(b => 1);
+const c = p.then(b => 1, e => 'error');
+const d = p.then(b => 1, e => { });
+const e = p.then(b => 1, e => { throw Error(); });
+const f = p.then(b => 1, e => Promise.reject(Error()));
+const g = p.catch(e => 'error');
+const h = p.catch(e => { });
+const i = p.catch(e => { throw Error(); });
+const j = p.catch(e => Promise.reject(Error()));
+
+async function A() {
+    const a = await p;
+    return a;
+}
+
+async function B() {
+    const a = await p;
+    return 1;
+}
+
+// NOTE: This reports a "No best comment type exists among return expressions." error, and is
+//       ignored to get the types result for the test.
+// async function C() {
+//     try {
+//         const a = await p;
+//         return 1;
+//     }
+//     catch (e) {
+//         return 'error';
+//     }
+// }
+
+async function D() {
+    try {
+        const a = await p;
+        return 1;
+    }
+    catch (e) {
+    }
+}
+
+async function E() {
+    try {
+        const a = await p;
+        return 1;
+    }
+    catch (e) {
+        throw Error();
+    }
+}
+
+async function F() {
+    try {
+        const a = await p;
+        return 1;
+    }
+    catch (e) {
+        return Promise.reject(Error());
+    }
+}
+
+async function G() {
+    try {
+        const a = await p;
+        return a;
+    }
+    catch (e) {
+        return;
+    }
+}
+
+async function H() {
+    try {
+        const a = await p;
+        return a;
+    }
+    catch (e) {
+        throw Error();
+    }
+}
+
+async function I() {
+    try {
+        const a = await p;
+        return a;
+    }
+    catch (e) {
+        return Promise.reject(Error());
+    }
+}
+
+// addresses github issue #4903:
+
+const p00 = p.catch();
+const p01 = p.catch(undefined);
+const p07 = p.catch(null);
+const p02 = p.catch(() => 1);
+const p03 = p.catch(() => {});
+const p04 = p.catch(() => {throw 1});
+const p05 = p.catch(() => Promise.reject(1));
+const p06 = p.catch(() => Promise.resolve(1));
+
+const p10 = p.then();
+
+const p20 = p.then(undefined);
+const p21 = p.then(() => 1);
+const p22 = p.then(() => {});
+const p23 = p.then(() => {throw 1});
+const p24 = p.then(() => Promise.resolve(1));
+const p25 = p.then(() => Promise.reject(1));
+
+const p30 = p.then(undefined, undefined);
+const p31 = p.then(undefined, () => 1);
+const p32 = p.then(undefined, () => {});
+const p33 = p.then(undefined, () => {throw 1});
+const p34 = p.then(undefined, () => Promise.resolve(1));
+const p35 = p.then(undefined, () => Promise.reject(1));
+
+const p40 = p.then(() => "1", undefined);
+const p41 = p.then(() => "1", () => 1);
+const p42 = p.then(() => "1", () => {});
+const p43 = p.then(() => "1", () => {throw 1});
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+const p45 = p.then(() => "1", () => Promise.reject(1));
+
+const p50 = p.then(() => {}, undefined);
+const p51 = p.then(() => {}, () => 1);
+const p52 = p.then(() => {}, () => {});
+const p53 = p.then(() => {}, () => {throw 1});
+const p54 = p.then(() => {}, () => Promise.resolve(1));
+const p55 = p.then(() => {}, () => Promise.reject(1));
+
+const p60 = p.then(() => {throw 1}, undefined);
+const p61 = p.then(() => {throw 1}, () => 1);
+const p62 = p.then(() => {throw 1}, () => {});
+const p63 = p.then(() => {throw 1}, () => {throw 1});
+const p64 = p.then(() => {throw 1}, () => Promise.resolve(1));
+const p65 = p.then(() => {throw 1}, () => Promise.reject(1));
+
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+const p72 = p.then(() => Promise.resolve("1"), () => {});
+const p73 = p.then(() => Promise.resolve("1"), () => {throw 1});
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+
+const p80 = p.then(() => Promise.reject(1), undefined);
+const p81 = p.then(() => Promise.reject(1), () => 1);
+const p82 = p.then(() => Promise.reject(1), () => {});
+const p83 = p.then(() => Promise.reject(1), () => {throw 1});
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
+
+//// [promiseTypeStrictNull.js]
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments)).next());
+    });
+};
+const a = p.then();
+const b = p.then(b => 1);
+const c = p.then(b => 1, e => 'error');
+const d = p.then(b => 1, e => { });
+const e = p.then(b => 1, e => { throw Error(); });
+const f = p.then(b => 1, e => Promise.reject(Error()));
+const g = p.catch(e => 'error');
+const h = p.catch(e => { });
+const i = p.catch(e => { throw Error(); });
+const j = p.catch(e => Promise.reject(Error()));
+function A() {
+    return __awaiter(this, void 0, void 0, function* () {
+        const a = yield p;
+        return a;
+    });
+}
+function B() {
+    return __awaiter(this, void 0, void 0, function* () {
+        const a = yield p;
+        return 1;
+    });
+}
+// NOTE: This reports a "No best comment type exists among return expressions." error, and is
+//       ignored to get the types result for the test.
+// async function C() {
+//     try {
+//         const a = await p;
+//         return 1;
+//     }
+//     catch (e) {
+//         return 'error';
+//     }
+// }
+function D() {
+    return __awaiter(this, void 0, void 0, function* () {
+        try {
+            const a = yield p;
+            return 1;
+        }
+        catch (e) {
+        }
+    });
+}
+function E() {
+    return __awaiter(this, void 0, void 0, function* () {
+        try {
+            const a = yield p;
+            return 1;
+        }
+        catch (e) {
+            throw Error();
+        }
+    });
+}
+function F() {
+    return __awaiter(this, void 0, void 0, function* () {
+        try {
+            const a = yield p;
+            return 1;
+        }
+        catch (e) {
+            return Promise.reject(Error());
+        }
+    });
+}
+function G() {
+    return __awaiter(this, void 0, void 0, function* () {
+        try {
+            const a = yield p;
+            return a;
+        }
+        catch (e) {
+            return;
+        }
+    });
+}
+function H() {
+    return __awaiter(this, void 0, void 0, function* () {
+        try {
+            const a = yield p;
+            return a;
+        }
+        catch (e) {
+            throw Error();
+        }
+    });
+}
+function I() {
+    return __awaiter(this, void 0, void 0, function* () {
+        try {
+            const a = yield p;
+            return a;
+        }
+        catch (e) {
+            return Promise.reject(Error());
+        }
+    });
+}
+// addresses github issue #4903:
+const p00 = p.catch();
+const p01 = p.catch(undefined);
+const p07 = p.catch(null);
+const p02 = p.catch(() => 1);
+const p03 = p.catch(() => { });
+const p04 = p.catch(() => { throw 1; });
+const p05 = p.catch(() => Promise.reject(1));
+const p06 = p.catch(() => Promise.resolve(1));
+const p10 = p.then();
+const p20 = p.then(undefined);
+const p21 = p.then(() => 1);
+const p22 = p.then(() => { });
+const p23 = p.then(() => { throw 1; });
+const p24 = p.then(() => Promise.resolve(1));
+const p25 = p.then(() => Promise.reject(1));
+const p30 = p.then(undefined, undefined);
+const p31 = p.then(undefined, () => 1);
+const p32 = p.then(undefined, () => { });
+const p33 = p.then(undefined, () => { throw 1; });
+const p34 = p.then(undefined, () => Promise.resolve(1));
+const p35 = p.then(undefined, () => Promise.reject(1));
+const p40 = p.then(() => "1", undefined);
+const p41 = p.then(() => "1", () => 1);
+const p42 = p.then(() => "1", () => { });
+const p43 = p.then(() => "1", () => { throw 1; });
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+const p45 = p.then(() => "1", () => Promise.reject(1));
+const p50 = p.then(() => { }, undefined);
+const p51 = p.then(() => { }, () => 1);
+const p52 = p.then(() => { }, () => { });
+const p53 = p.then(() => { }, () => { throw 1; });
+const p54 = p.then(() => { }, () => Promise.resolve(1));
+const p55 = p.then(() => { }, () => Promise.reject(1));
+const p60 = p.then(() => { throw 1; }, undefined);
+const p61 = p.then(() => { throw 1; }, () => 1);
+const p62 = p.then(() => { throw 1; }, () => { });
+const p63 = p.then(() => { throw 1; }, () => { throw 1; });
+const p64 = p.then(() => { throw 1; }, () => Promise.resolve(1));
+const p65 = p.then(() => { throw 1; }, () => Promise.reject(1));
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+const p72 = p.then(() => Promise.resolve("1"), () => { });
+const p73 = p.then(() => Promise.resolve("1"), () => { throw 1; });
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+const p80 = p.then(() => Promise.reject(1), undefined);
+const p81 = p.then(() => Promise.reject(1), () => 1);
+const p82 = p.then(() => Promise.reject(1), () => { });
+const p83 = p.then(() => Promise.reject(1), () => { throw 1; });
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
diff --git a/tests/baselines/reference/promiseTypeStrictNull.symbols b/tests/baselines/reference/promiseTypeStrictNull.symbols
new file mode 100644
index 0000000000000..bf14c51656e05
--- /dev/null
+++ b/tests/baselines/reference/promiseTypeStrictNull.symbols
@@ -0,0 +1,640 @@
+=== tests/cases/compiler/promiseTypeStrictNull.ts ===
+declare var p: Promise<boolean>;
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+
+const a = p.then();
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 2, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const b = p.then(b => 1);
+>b : Symbol(b, Decl(promiseTypeStrictNull.ts, 3, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>b : Symbol(b, Decl(promiseTypeStrictNull.ts, 3, 17))
+
+const c = p.then(b => 1, e => 'error');
+>c : Symbol(c, Decl(promiseTypeStrictNull.ts, 4, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>b : Symbol(b, Decl(promiseTypeStrictNull.ts, 4, 17))
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 4, 24))
+
+const d = p.then(b => 1, e => { });
+>d : Symbol(d, Decl(promiseTypeStrictNull.ts, 5, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>b : Symbol(b, Decl(promiseTypeStrictNull.ts, 5, 17))
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 5, 24))
+
+const e = p.then(b => 1, e => { throw Error(); });
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 6, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>b : Symbol(b, Decl(promiseTypeStrictNull.ts, 6, 17))
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 6, 24))
+>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
+
+const f = p.then(b => 1, e => Promise.reject(Error()));
+>f : Symbol(f, Decl(promiseTypeStrictNull.ts, 7, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>b : Symbol(b, Decl(promiseTypeStrictNull.ts, 7, 17))
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 7, 24))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
+
+const g = p.catch(e => 'error');
+>g : Symbol(g, Decl(promiseTypeStrictNull.ts, 8, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 8, 18))
+
+const h = p.catch(e => { });
+>h : Symbol(h, Decl(promiseTypeStrictNull.ts, 9, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 9, 18))
+
+const i = p.catch(e => { throw Error(); });
+>i : Symbol(i, Decl(promiseTypeStrictNull.ts, 10, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 10, 18))
+>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
+
+const j = p.catch(e => Promise.reject(Error()));
+>j : Symbol(j, Decl(promiseTypeStrictNull.ts, 11, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 11, 18))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
+
+async function A() {
+>A : Symbol(A, Decl(promiseTypeStrictNull.ts, 11, 48))
+
+    const a = await p;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 14, 9))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+
+    return a;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 14, 9))
+}
+
+async function B() {
+>B : Symbol(B, Decl(promiseTypeStrictNull.ts, 16, 1))
+
+    const a = await p;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 19, 9))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+
+    return 1;
+}
+
+// NOTE: This reports a "No best comment type exists among return expressions." error, and is
+//       ignored to get the types result for the test.
+// async function C() {
+//     try {
+//         const a = await p;
+//         return 1;
+//     }
+//     catch (e) {
+//         return 'error';
+//     }
+// }
+
+async function D() {
+>D : Symbol(D, Decl(promiseTypeStrictNull.ts, 21, 1))
+
+    try {
+        const a = await p;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 37, 13))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+
+        return 1;
+    }
+    catch (e) {
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 40, 11))
+    }
+}
+
+async function E() {
+>E : Symbol(E, Decl(promiseTypeStrictNull.ts, 42, 1))
+
+    try {
+        const a = await p;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 46, 13))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+
+        return 1;
+    }
+    catch (e) {
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 49, 11))
+
+        throw Error();
+>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
+    }
+}
+
+async function F() {
+>F : Symbol(F, Decl(promiseTypeStrictNull.ts, 52, 1))
+
+    try {
+        const a = await p;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 56, 13))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+
+        return 1;
+    }
+    catch (e) {
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 59, 11))
+
+        return Promise.reject(Error());
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
+    }
+}
+
+async function G() {
+>G : Symbol(G, Decl(promiseTypeStrictNull.ts, 62, 1))
+
+    try {
+        const a = await p;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 66, 13))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+
+        return a;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 66, 13))
+    }
+    catch (e) {
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 69, 11))
+
+        return;
+    }
+}
+
+async function H() {
+>H : Symbol(H, Decl(promiseTypeStrictNull.ts, 72, 1))
+
+    try {
+        const a = await p;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 76, 13))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+
+        return a;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 76, 13))
+    }
+    catch (e) {
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 79, 11))
+
+        throw Error();
+>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
+    }
+}
+
+async function I() {
+>I : Symbol(I, Decl(promiseTypeStrictNull.ts, 82, 1))
+
+    try {
+        const a = await p;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 86, 13))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+
+        return a;
+>a : Symbol(a, Decl(promiseTypeStrictNull.ts, 86, 13))
+    }
+    catch (e) {
+>e : Symbol(e, Decl(promiseTypeStrictNull.ts, 89, 11))
+
+        return Promise.reject(Error());
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
+    }
+}
+
+// addresses github issue #4903:
+
+const p00 = p.catch();
+>p00 : Symbol(p00, Decl(promiseTypeStrictNull.ts, 96, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p01 = p.catch(undefined);
+>p01 : Symbol(p01, Decl(promiseTypeStrictNull.ts, 97, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p07 = p.catch(null);
+>p07 : Symbol(p07, Decl(promiseTypeStrictNull.ts, 98, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p02 = p.catch(() => 1);
+>p02 : Symbol(p02, Decl(promiseTypeStrictNull.ts, 99, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p03 = p.catch(() => {});
+>p03 : Symbol(p03, Decl(promiseTypeStrictNull.ts, 100, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p04 = p.catch(() => {throw 1});
+>p04 : Symbol(p04, Decl(promiseTypeStrictNull.ts, 101, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p05 = p.catch(() => Promise.reject(1));
+>p05 : Symbol(p05, Decl(promiseTypeStrictNull.ts, 102, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p06 = p.catch(() => Promise.resolve(1));
+>p06 : Symbol(p06, Decl(promiseTypeStrictNull.ts, 103, 5))
+>p.catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>catch : Symbol(Promise.catch, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p10 = p.then();
+>p10 : Symbol(p10, Decl(promiseTypeStrictNull.ts, 105, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p20 = p.then(undefined);
+>p20 : Symbol(p20, Decl(promiseTypeStrictNull.ts, 107, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p21 = p.then(() => 1);
+>p21 : Symbol(p21, Decl(promiseTypeStrictNull.ts, 108, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p22 = p.then(() => {});
+>p22 : Symbol(p22, Decl(promiseTypeStrictNull.ts, 109, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p23 = p.then(() => {throw 1});
+>p23 : Symbol(p23, Decl(promiseTypeStrictNull.ts, 110, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p24 = p.then(() => Promise.resolve(1));
+>p24 : Symbol(p24, Decl(promiseTypeStrictNull.ts, 111, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p25 = p.then(() => Promise.reject(1));
+>p25 : Symbol(p25, Decl(promiseTypeStrictNull.ts, 112, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p30 = p.then(undefined, undefined);
+>p30 : Symbol(p30, Decl(promiseTypeStrictNull.ts, 114, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+>undefined : Symbol(undefined)
+
+const p31 = p.then(undefined, () => 1);
+>p31 : Symbol(p31, Decl(promiseTypeStrictNull.ts, 115, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p32 = p.then(undefined, () => {});
+>p32 : Symbol(p32, Decl(promiseTypeStrictNull.ts, 116, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p33 = p.then(undefined, () => {throw 1});
+>p33 : Symbol(p33, Decl(promiseTypeStrictNull.ts, 117, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p34 = p.then(undefined, () => Promise.resolve(1));
+>p34 : Symbol(p34, Decl(promiseTypeStrictNull.ts, 118, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p35 = p.then(undefined, () => Promise.reject(1));
+>p35 : Symbol(p35, Decl(promiseTypeStrictNull.ts, 119, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p40 = p.then(() => "1", undefined);
+>p40 : Symbol(p40, Decl(promiseTypeStrictNull.ts, 121, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p41 = p.then(() => "1", () => 1);
+>p41 : Symbol(p41, Decl(promiseTypeStrictNull.ts, 122, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p42 = p.then(() => "1", () => {});
+>p42 : Symbol(p42, Decl(promiseTypeStrictNull.ts, 123, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p43 = p.then(() => "1", () => {throw 1});
+>p43 : Symbol(p43, Decl(promiseTypeStrictNull.ts, 124, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+>p44 : Symbol(p44, Decl(promiseTypeStrictNull.ts, 125, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p45 = p.then(() => "1", () => Promise.reject(1));
+>p45 : Symbol(p45, Decl(promiseTypeStrictNull.ts, 126, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p50 = p.then(() => {}, undefined);
+>p50 : Symbol(p50, Decl(promiseTypeStrictNull.ts, 128, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p51 = p.then(() => {}, () => 1);
+>p51 : Symbol(p51, Decl(promiseTypeStrictNull.ts, 129, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p52 = p.then(() => {}, () => {});
+>p52 : Symbol(p52, Decl(promiseTypeStrictNull.ts, 130, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p53 = p.then(() => {}, () => {throw 1});
+>p53 : Symbol(p53, Decl(promiseTypeStrictNull.ts, 131, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p54 = p.then(() => {}, () => Promise.resolve(1));
+>p54 : Symbol(p54, Decl(promiseTypeStrictNull.ts, 132, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p55 = p.then(() => {}, () => Promise.reject(1));
+>p55 : Symbol(p55, Decl(promiseTypeStrictNull.ts, 133, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p60 = p.then(() => {throw 1}, undefined);
+>p60 : Symbol(p60, Decl(promiseTypeStrictNull.ts, 135, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p61 = p.then(() => {throw 1}, () => 1);
+>p61 : Symbol(p61, Decl(promiseTypeStrictNull.ts, 136, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p62 = p.then(() => {throw 1}, () => {});
+>p62 : Symbol(p62, Decl(promiseTypeStrictNull.ts, 137, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p63 = p.then(() => {throw 1}, () => {throw 1});
+>p63 : Symbol(p63, Decl(promiseTypeStrictNull.ts, 138, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p64 = p.then(() => {throw 1}, () => Promise.resolve(1));
+>p64 : Symbol(p64, Decl(promiseTypeStrictNull.ts, 139, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p65 = p.then(() => {throw 1}, () => Promise.reject(1));
+>p65 : Symbol(p65, Decl(promiseTypeStrictNull.ts, 140, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+>p70 : Symbol(p70, Decl(promiseTypeStrictNull.ts, 142, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+>p71 : Symbol(p71, Decl(promiseTypeStrictNull.ts, 143, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p72 = p.then(() => Promise.resolve("1"), () => {});
+>p72 : Symbol(p72, Decl(promiseTypeStrictNull.ts, 144, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p73 = p.then(() => Promise.resolve("1"), () => {throw 1});
+>p73 : Symbol(p73, Decl(promiseTypeStrictNull.ts, 145, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+>p74 : Symbol(p74, Decl(promiseTypeStrictNull.ts, 146, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+>p75 : Symbol(p75, Decl(promiseTypeStrictNull.ts, 147, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p80 = p.then(() => Promise.reject(1), undefined);
+>p80 : Symbol(p80, Decl(promiseTypeStrictNull.ts, 149, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>undefined : Symbol(undefined)
+
+const p81 = p.then(() => Promise.reject(1), () => 1);
+>p81 : Symbol(p81, Decl(promiseTypeStrictNull.ts, 150, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p82 = p.then(() => Promise.reject(1), () => {});
+>p82 : Symbol(p82, Decl(promiseTypeStrictNull.ts, 151, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p83 = p.then(() => Promise.reject(1), () => {throw 1});
+>p83 : Symbol(p83, Decl(promiseTypeStrictNull.ts, 152, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+>p84 : Symbol(p84, Decl(promiseTypeStrictNull.ts, 153, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
+>p85 : Symbol(p85, Decl(promiseTypeStrictNull.ts, 154, 5))
+>p.then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>p : Symbol(p, Decl(promiseTypeStrictNull.ts, 0, 11))
+>then : Symbol(Promise.then, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise.reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+>Promise : Symbol(Promise, Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --))
+>reject : Symbol(PromiseConstructor.reject, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
+
diff --git a/tests/baselines/reference/promiseTypeStrictNull.types b/tests/baselines/reference/promiseTypeStrictNull.types
new file mode 100644
index 0000000000000..951d4b5759012
--- /dev/null
+++ b/tests/baselines/reference/promiseTypeStrictNull.types
@@ -0,0 +1,900 @@
+=== tests/cases/compiler/promiseTypeStrictNull.ts ===
+declare var p: Promise<boolean>;
+>p : Promise<boolean>
+>Promise : Promise<T>
+
+const a = p.then();
+>a : Promise<boolean>
+>p.then() : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+
+const b = p.then(b => 1);
+>b : Promise<number>
+>p.then(b => 1) : Promise<number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>b => 1 : (b: boolean) => number
+>b : boolean
+>1 : number
+
+const c = p.then(b => 1, e => 'error');
+>c : Promise<string | number>
+>p.then(b => 1, e => 'error') : Promise<string | number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>b => 1 : (b: boolean) => number
+>b : boolean
+>1 : number
+>e => 'error' : (e: any) => string
+>e : any
+>'error' : string
+
+const d = p.then(b => 1, e => { });
+>d : Promise<number | void>
+>p.then(b => 1, e => { }) : Promise<number | void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>b => 1 : (b: boolean) => number
+>b : boolean
+>1 : number
+>e => { } : (e: any) => void
+>e : any
+
+const e = p.then(b => 1, e => { throw Error(); });
+>e : Promise<number>
+>p.then(b => 1, e => { throw Error(); }) : Promise<number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>b => 1 : (b: boolean) => number
+>b : boolean
+>1 : number
+>e => { throw Error(); } : (e: any) => never
+>e : any
+>Error() : Error
+>Error : ErrorConstructor
+
+const f = p.then(b => 1, e => Promise.reject(Error()));
+>f : Promise<number>
+>p.then(b => 1, e => Promise.reject(Error())) : Promise<number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>b => 1 : (b: boolean) => number
+>b : boolean
+>1 : number
+>e => Promise.reject(Error()) : (e: any) => Promise<never>
+>e : any
+>Promise.reject(Error()) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Error() : Error
+>Error : ErrorConstructor
+
+const g = p.catch(e => 'error');
+>g : Promise<string | boolean>
+>p.catch(e => 'error') : Promise<string | boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>e => 'error' : (e: any) => string
+>e : any
+>'error' : string
+
+const h = p.catch(e => { });
+>h : Promise<boolean | void>
+>p.catch(e => { }) : Promise<boolean | void>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>e => { } : (e: any) => void
+>e : any
+
+const i = p.catch(e => { throw Error(); });
+>i : Promise<boolean>
+>p.catch(e => { throw Error(); }) : Promise<boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>e => { throw Error(); } : (e: any) => never
+>e : any
+>Error() : Error
+>Error : ErrorConstructor
+
+const j = p.catch(e => Promise.reject(Error()));
+>j : Promise<boolean>
+>p.catch(e => Promise.reject(Error())) : Promise<boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>e => Promise.reject(Error()) : (e: any) => Promise<never>
+>e : any
+>Promise.reject(Error()) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Error() : Error
+>Error : ErrorConstructor
+
+async function A() {
+>A : () => Promise<boolean>
+
+    const a = await p;
+>a : boolean
+>await p : boolean
+>p : Promise<boolean>
+
+    return a;
+>a : boolean
+}
+
+async function B() {
+>B : () => Promise<number>
+
+    const a = await p;
+>a : boolean
+>await p : boolean
+>p : Promise<boolean>
+
+    return 1;
+>1 : number
+}
+
+// NOTE: This reports a "No best comment type exists among return expressions." error, and is
+//       ignored to get the types result for the test.
+// async function C() {
+//     try {
+//         const a = await p;
+//         return 1;
+//     }
+//     catch (e) {
+//         return 'error';
+//     }
+// }
+
+async function D() {
+>D : () => Promise<number | undefined>
+
+    try {
+        const a = await p;
+>a : boolean
+>await p : boolean
+>p : Promise<boolean>
+
+        return 1;
+>1 : number
+    }
+    catch (e) {
+>e : any
+    }
+}
+
+async function E() {
+>E : () => Promise<number>
+
+    try {
+        const a = await p;
+>a : boolean
+>await p : boolean
+>p : Promise<boolean>
+
+        return 1;
+>1 : number
+    }
+    catch (e) {
+>e : any
+
+        throw Error();
+>Error() : Error
+>Error : ErrorConstructor
+    }
+}
+
+async function F() {
+>F : () => Promise<number>
+
+    try {
+        const a = await p;
+>a : boolean
+>await p : boolean
+>p : Promise<boolean>
+
+        return 1;
+>1 : number
+    }
+    catch (e) {
+>e : any
+
+        return Promise.reject(Error());
+>Promise.reject(Error()) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Error() : Error
+>Error : ErrorConstructor
+    }
+}
+
+async function G() {
+>G : () => Promise<boolean | undefined>
+
+    try {
+        const a = await p;
+>a : boolean
+>await p : boolean
+>p : Promise<boolean>
+
+        return a;
+>a : boolean
+    }
+    catch (e) {
+>e : any
+
+        return;
+    }
+}
+
+async function H() {
+>H : () => Promise<boolean>
+
+    try {
+        const a = await p;
+>a : boolean
+>await p : boolean
+>p : Promise<boolean>
+
+        return a;
+>a : boolean
+    }
+    catch (e) {
+>e : any
+
+        throw Error();
+>Error() : Error
+>Error : ErrorConstructor
+    }
+}
+
+async function I() {
+>I : () => Promise<boolean>
+
+    try {
+        const a = await p;
+>a : boolean
+>await p : boolean
+>p : Promise<boolean>
+
+        return a;
+>a : boolean
+    }
+    catch (e) {
+>e : any
+
+        return Promise.reject(Error());
+>Promise.reject(Error()) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Error() : Error
+>Error : ErrorConstructor
+    }
+}
+
+// addresses github issue #4903:
+
+const p00 = p.catch();
+>p00 : Promise<boolean>
+>p.catch() : Promise<boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+
+const p01 = p.catch(undefined);
+>p01 : Promise<boolean>
+>p.catch(undefined) : Promise<boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>undefined : undefined
+
+const p07 = p.catch(null);
+>p07 : Promise<boolean>
+>p.catch(null) : Promise<boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>null : null
+
+const p02 = p.catch(() => 1);
+>p02 : Promise<number | boolean>
+>p.catch(() => 1) : Promise<number | boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => 1 : () => number
+>1 : number
+
+const p03 = p.catch(() => {});
+>p03 : Promise<boolean | void>
+>p.catch(() => {}) : Promise<boolean | void>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => {} : () => void
+
+const p04 = p.catch(() => {throw 1});
+>p04 : Promise<boolean>
+>p.catch(() => {throw 1}) : Promise<boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => {throw 1} : () => never
+>1 : number
+
+const p05 = p.catch(() => Promise.reject(1));
+>p05 : Promise<boolean>
+>p.catch(() => Promise.reject(1)) : Promise<boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p06 = p.catch(() => Promise.resolve(1));
+>p06 : Promise<number | boolean>
+>p.catch(() => Promise.resolve(1)) : Promise<number | boolean>
+>p.catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>p : Promise<boolean>
+>catch : { (onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; }
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p10 = p.then();
+>p10 : Promise<boolean>
+>p.then() : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+
+const p20 = p.then(undefined);
+>p20 : Promise<boolean>
+>p.then(undefined) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+
+const p21 = p.then(() => 1);
+>p21 : Promise<number>
+>p.then(() => 1) : Promise<number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => 1 : () => number
+>1 : number
+
+const p22 = p.then(() => {});
+>p22 : Promise<void>
+>p.then(() => {}) : Promise<void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+
+const p23 = p.then(() => {throw 1});
+>p23 : Promise<boolean>
+>p.then(() => {throw 1}) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+
+const p24 = p.then(() => Promise.resolve(1));
+>p24 : Promise<number>
+>p.then(() => Promise.resolve(1)) : Promise<number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p25 = p.then(() => Promise.reject(1));
+>p25 : Promise<boolean>
+>p.then(() => Promise.reject(1)) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p30 = p.then(undefined, undefined);
+>p30 : Promise<boolean>
+>p.then(undefined, undefined) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>undefined : undefined
+
+const p31 = p.then(undefined, () => 1);
+>p31 : Promise<number | boolean>
+>p.then(undefined, () => 1) : Promise<number | boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => 1 : () => number
+>1 : number
+
+const p32 = p.then(undefined, () => {});
+>p32 : Promise<boolean | void>
+>p.then(undefined, () => {}) : Promise<boolean | void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => {} : () => void
+
+const p33 = p.then(undefined, () => {throw 1});
+>p33 : Promise<boolean>
+>p.then(undefined, () => {throw 1}) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => {throw 1} : () => never
+>1 : number
+
+const p34 = p.then(undefined, () => Promise.resolve(1));
+>p34 : Promise<number | boolean>
+>p.then(undefined, () => Promise.resolve(1)) : Promise<number | boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p35 = p.then(undefined, () => Promise.reject(1));
+>p35 : Promise<boolean>
+>p.then(undefined, () => Promise.reject(1)) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>undefined : undefined
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p40 = p.then(() => "1", undefined);
+>p40 : Promise<string>
+>p.then(() => "1", undefined) : Promise<string>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>undefined : undefined
+
+const p41 = p.then(() => "1", () => 1);
+>p41 : Promise<string | number>
+>p.then(() => "1", () => 1) : Promise<string | number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => 1 : () => number
+>1 : number
+
+const p42 = p.then(() => "1", () => {});
+>p42 : Promise<string | void>
+>p.then(() => "1", () => {}) : Promise<string | void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => {} : () => void
+
+const p43 = p.then(() => "1", () => {throw 1});
+>p43 : Promise<string>
+>p.then(() => "1", () => {throw 1}) : Promise<string>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => {throw 1} : () => never
+>1 : number
+
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+>p44 : Promise<string | number>
+>p.then(() => "1", () => Promise.resolve(1)) : Promise<string | number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p45 = p.then(() => "1", () => Promise.reject(1));
+>p45 : Promise<string>
+>p.then(() => "1", () => Promise.reject(1)) : Promise<string>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => "1" : () => string
+>"1" : string
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p50 = p.then(() => {}, undefined);
+>p50 : Promise<void>
+>p.then(() => {}, undefined) : Promise<void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>undefined : undefined
+
+const p51 = p.then(() => {}, () => 1);
+>p51 : Promise<number | void>
+>p.then(() => {}, () => 1) : Promise<number | void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => 1 : () => number
+>1 : number
+
+const p52 = p.then(() => {}, () => {});
+>p52 : Promise<void>
+>p.then(() => {}, () => {}) : Promise<void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => {} : () => void
+
+const p53 = p.then(() => {}, () => {throw 1});
+>p53 : Promise<void>
+>p.then(() => {}, () => {throw 1}) : Promise<void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => {throw 1} : () => never
+>1 : number
+
+const p54 = p.then(() => {}, () => Promise.resolve(1));
+>p54 : Promise<number | void>
+>p.then(() => {}, () => Promise.resolve(1)) : Promise<number | void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p55 = p.then(() => {}, () => Promise.reject(1));
+>p55 : Promise<void>
+>p.then(() => {}, () => Promise.reject(1)) : Promise<void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {} : () => void
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p60 = p.then(() => {throw 1}, undefined);
+>p60 : Promise<boolean>
+>p.then(() => {throw 1}, undefined) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>undefined : undefined
+
+const p61 = p.then(() => {throw 1}, () => 1);
+>p61 : Promise<number | boolean>
+>p.then(() => {throw 1}, () => 1) : Promise<number | boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => 1 : () => number
+>1 : number
+
+const p62 = p.then(() => {throw 1}, () => {});
+>p62 : Promise<boolean | void>
+>p.then(() => {throw 1}, () => {}) : Promise<boolean | void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => {} : () => void
+
+const p63 = p.then(() => {throw 1}, () => {throw 1});
+>p63 : Promise<boolean>
+>p.then(() => {throw 1}, () => {throw 1}) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => {throw 1} : () => never
+>1 : number
+
+const p64 = p.then(() => {throw 1}, () => Promise.resolve(1));
+>p64 : Promise<number | boolean>
+>p.then(() => {throw 1}, () => Promise.resolve(1)) : Promise<number | boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p65 = p.then(() => {throw 1}, () => Promise.reject(1));
+>p65 : Promise<boolean>
+>p.then(() => {throw 1}, () => Promise.reject(1)) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => {throw 1} : () => never
+>1 : number
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+>p70 : Promise<string>
+>p.then(() => Promise.resolve("1"), undefined) : Promise<string>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>undefined : undefined
+
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+>p71 : Promise<string | number>
+>p.then(() => Promise.resolve("1"), () => 1) : Promise<string | number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => 1 : () => number
+>1 : number
+
+const p72 = p.then(() => Promise.resolve("1"), () => {});
+>p72 : Promise<string | void>
+>p.then(() => Promise.resolve("1"), () => {}) : Promise<string | void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => {} : () => void
+
+const p73 = p.then(() => Promise.resolve("1"), () => {throw 1});
+>p73 : Promise<string>
+>p.then(() => Promise.resolve("1"), () => {throw 1}) : Promise<string>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => {throw 1} : () => never
+>1 : number
+
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+>p74 : Promise<string | number>
+>p.then(() => Promise.resolve("1"), () => Promise.resolve(1)) : Promise<string | number>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+>p75 : Promise<string>
+>p.then(() => Promise.resolve("1"), () => Promise.reject(1)) : Promise<string>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.resolve("1") : () => Promise<string>
+>Promise.resolve("1") : Promise<string>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>"1" : string
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
+const p80 = p.then(() => Promise.reject(1), undefined);
+>p80 : Promise<boolean>
+>p.then(() => Promise.reject(1), undefined) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>undefined : undefined
+
+const p81 = p.then(() => Promise.reject(1), () => 1);
+>p81 : Promise<number | boolean>
+>p.then(() => Promise.reject(1), () => 1) : Promise<number | boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => 1 : () => number
+>1 : number
+
+const p82 = p.then(() => Promise.reject(1), () => {});
+>p82 : Promise<boolean | void>
+>p.then(() => Promise.reject(1), () => {}) : Promise<boolean | void>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => {} : () => void
+
+const p83 = p.then(() => Promise.reject(1), () => {throw 1});
+>p83 : Promise<boolean>
+>p.then(() => Promise.reject(1), () => {throw 1}) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => {throw 1} : () => never
+>1 : number
+
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+>p84 : Promise<number | boolean>
+>p.then(() => Promise.reject(1), () => Promise.resolve(1)) : Promise<number | boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => Promise.resolve(1) : () => Promise<number>
+>Promise.resolve(1) : Promise<number>
+>Promise.resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>Promise : PromiseConstructor
+>resolve : { <T>(value: T | PromiseLike<T>): Promise<T>; (): Promise<void>; }
+>1 : number
+
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
+>p85 : Promise<boolean>
+>p.then(() => Promise.reject(1), () => Promise.reject(1)) : Promise<boolean>
+>p.then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>p : Promise<boolean>
+>then : { (onfulfilled?: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected?: ((reason: any) => boolean | PromiseLike<boolean>) | null | undefined): Promise<boolean>; <TResult>(onfulfilled: ((value: boolean) => boolean | PromiseLike<boolean>) | null | undefined, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<boolean | TResult>; <TResult>(onfulfilled: (value: boolean) => TResult | PromiseLike<TResult>, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: boolean) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+>() => Promise.reject(1) : () => Promise<never>
+>Promise.reject(1) : Promise<never>
+>Promise.reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>Promise : PromiseConstructor
+>reject : { (reason: any): Promise<never>; <T>(reason: any): Promise<T>; }
+>1 : number
+
diff --git a/tests/baselines/reference/promiseVoidErrorCallback.types b/tests/baselines/reference/promiseVoidErrorCallback.types
index 94773394ade26..747a479bdd0d4 100644
--- a/tests/baselines/reference/promiseVoidErrorCallback.types
+++ b/tests/baselines/reference/promiseVoidErrorCallback.types
@@ -54,14 +54,14 @@ function f2(x: T1): T2 {
 var x3 = f1()
 >x3 : Promise<{ __t3: string; }>
 >f1()    .then(f2, (e: Error) => {    throw e;})    .then((x: T2) => {    return { __t3: x.__t2 + "bar" };}) : Promise<{ __t3: string; }>
->f1()    .then(f2, (e: Error) => {    throw e;})    .then : { <TResult1, TResult2>(onfulfilled: (value: T2) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: T2) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: T2) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<T2>; }
+>f1()    .then(f2, (e: Error) => {    throw e;})    .then : { (onfulfilled?: (value: T2) => T2 | PromiseLike<T2>, onrejected?: (reason: any) => T2 | PromiseLike<T2>): Promise<T2>; <TResult>(onfulfilled: (value: T2) => T2 | PromiseLike<T2>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<T2 | TResult>; <TResult>(onfulfilled: (value: T2) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: T2) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >f1()    .then(f2, (e: Error) => {    throw e;}) : Promise<T2>
->f1()    .then : { <TResult1, TResult2>(onfulfilled: (value: T1) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: T1) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: T1) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<T1>; }
+>f1()    .then : { (onfulfilled?: (value: T1) => T1 | PromiseLike<T1>, onrejected?: (reason: any) => T1 | PromiseLike<T1>): Promise<T1>; <TResult>(onfulfilled: (value: T1) => T1 | PromiseLike<T1>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<T1 | TResult>; <TResult>(onfulfilled: (value: T1) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: T1) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >f1() : Promise<T1>
 >f1 : () => Promise<T1>
 
     .then(f2, (e: Error) => {
->then : { <TResult1, TResult2>(onfulfilled: (value: T1) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: T1) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: T1) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<T1>; }
+>then : { (onfulfilled?: (value: T1) => T1 | PromiseLike<T1>, onrejected?: (reason: any) => T1 | PromiseLike<T1>): Promise<T1>; <TResult>(onfulfilled: (value: T1) => T1 | PromiseLike<T1>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<T1 | TResult>; <TResult>(onfulfilled: (value: T1) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: T1) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >f2 : (x: T1) => T2
 >(e: Error) => {    throw e;} : (e: Error) => never
 >e : Error
@@ -72,7 +72,7 @@ var x3 = f1()
 
 })
     .then((x: T2) => {
->then : { <TResult1, TResult2>(onfulfilled: (value: T2) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; <TResult>(onfulfilled: (value: T2) => TResult | PromiseLike<TResult>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult>(onfulfilled: (value: T2) => TResult | PromiseLike<TResult>): Promise<TResult>; (): Promise<T2>; }
+>then : { (onfulfilled?: (value: T2) => T2 | PromiseLike<T2>, onrejected?: (reason: any) => T2 | PromiseLike<T2>): Promise<T2>; <TResult>(onfulfilled: (value: T2) => T2 | PromiseLike<T2>, onrejected: (reason: any) => TResult | PromiseLike<TResult>): Promise<T2 | TResult>; <TResult>(onfulfilled: (value: T2) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>; <TResult1, TResult2>(onfulfilled: (value: T2) => TResult1 | PromiseLike<TResult1>, onrejected: (reason: any) => TResult2 | PromiseLike<TResult2>): Promise<TResult1 | TResult2>; }
 >(x: T2) => {    return { __t3: x.__t2 + "bar" };} : (x: T2) => { __t3: string; }
 >x : T2
 >T2 : T2
diff --git a/tests/cases/compiler/promiseType.ts b/tests/cases/compiler/promiseType.ts
index c1b795b6cc765..b105485b2442e 100644
--- a/tests/cases/compiler/promiseType.ts
+++ b/tests/cases/compiler/promiseType.ts
@@ -91,4 +91,66 @@ async function I() {
     catch (e) {
         return Promise.reject(Error());
     }
-}
\ No newline at end of file
+}
+
+// addresses github issue #4903:
+
+const p00 = p.catch();
+const p01 = p.catch(undefined);
+const p07 = p.catch(null);
+const p02 = p.catch(() => 1);
+const p03 = p.catch(() => {});
+const p04 = p.catch(() => {throw 1});
+const p05 = p.catch(() => Promise.reject(1));
+const p06 = p.catch(() => Promise.resolve(1));
+
+const p10 = p.then();
+
+const p20 = p.then(undefined);
+const p21 = p.then(() => 1);
+const p22 = p.then(() => {});
+const p23 = p.then(() => {throw 1});
+const p24 = p.then(() => Promise.resolve(1));
+const p25 = p.then(() => Promise.reject(1));
+
+const p30 = p.then(undefined, undefined);
+const p31 = p.then(undefined, () => 1);
+const p32 = p.then(undefined, () => {});
+const p33 = p.then(undefined, () => {throw 1});
+const p34 = p.then(undefined, () => Promise.resolve(1));
+const p35 = p.then(undefined, () => Promise.reject(1));
+
+const p40 = p.then(() => "1", undefined);
+const p41 = p.then(() => "1", () => 1);
+const p42 = p.then(() => "1", () => {});
+const p43 = p.then(() => "1", () => {throw 1});
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+const p45 = p.then(() => "1", () => Promise.reject(1));
+
+const p50 = p.then(() => {}, undefined);
+const p51 = p.then(() => {}, () => 1);
+const p52 = p.then(() => {}, () => {});
+const p53 = p.then(() => {}, () => {throw 1});
+const p54 = p.then(() => {}, () => Promise.resolve(1));
+const p55 = p.then(() => {}, () => Promise.reject(1));
+
+const p60 = p.then(() => {throw 1}, undefined);
+const p61 = p.then(() => {throw 1}, () => 1);
+const p62 = p.then(() => {throw 1}, () => {});
+const p63 = p.then(() => {throw 1}, () => {throw 1});
+const p64 = p.then(() => {throw 1}, () => Promise.resolve(1));
+const p65 = p.then(() => {throw 1}, () => Promise.reject(1));
+
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+const p72 = p.then(() => Promise.resolve("1"), () => {});
+const p73 = p.then(() => Promise.resolve("1"), () => {throw 1});
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+
+const p80 = p.then(() => Promise.reject(1), undefined);
+const p81 = p.then(() => Promise.reject(1), () => 1);
+const p82 = p.then(() => Promise.reject(1), () => {});
+const p83 = p.then(() => Promise.reject(1), () => {throw 1});
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
\ No newline at end of file
diff --git a/tests/cases/compiler/promiseTypeStrictNull.ts b/tests/cases/compiler/promiseTypeStrictNull.ts
new file mode 100644
index 0000000000000..ce6dcd364618f
--- /dev/null
+++ b/tests/cases/compiler/promiseTypeStrictNull.ts
@@ -0,0 +1,157 @@
+// @target: es6
+// @strictNullChecks: true
+declare var p: Promise<boolean>;
+
+const a = p.then();
+const b = p.then(b => 1);
+const c = p.then(b => 1, e => 'error');
+const d = p.then(b => 1, e => { });
+const e = p.then(b => 1, e => { throw Error(); });
+const f = p.then(b => 1, e => Promise.reject(Error()));
+const g = p.catch(e => 'error');
+const h = p.catch(e => { });
+const i = p.catch(e => { throw Error(); });
+const j = p.catch(e => Promise.reject(Error()));
+
+async function A() {
+    const a = await p;
+    return a;
+}
+
+async function B() {
+    const a = await p;
+    return 1;
+}
+
+// NOTE: This reports a "No best comment type exists among return expressions." error, and is
+//       ignored to get the types result for the test.
+// async function C() {
+//     try {
+//         const a = await p;
+//         return 1;
+//     }
+//     catch (e) {
+//         return 'error';
+//     }
+// }
+
+async function D() {
+    try {
+        const a = await p;
+        return 1;
+    }
+    catch (e) {
+    }
+}
+
+async function E() {
+    try {
+        const a = await p;
+        return 1;
+    }
+    catch (e) {
+        throw Error();
+    }
+}
+
+async function F() {
+    try {
+        const a = await p;
+        return 1;
+    }
+    catch (e) {
+        return Promise.reject(Error());
+    }
+}
+
+async function G() {
+    try {
+        const a = await p;
+        return a;
+    }
+    catch (e) {
+        return;
+    }
+}
+
+async function H() {
+    try {
+        const a = await p;
+        return a;
+    }
+    catch (e) {
+        throw Error();
+    }
+}
+
+async function I() {
+    try {
+        const a = await p;
+        return a;
+    }
+    catch (e) {
+        return Promise.reject(Error());
+    }
+}
+
+// addresses github issue #4903:
+
+const p00 = p.catch();
+const p01 = p.catch(undefined);
+const p07 = p.catch(null);
+const p02 = p.catch(() => 1);
+const p03 = p.catch(() => {});
+const p04 = p.catch(() => {throw 1});
+const p05 = p.catch(() => Promise.reject(1));
+const p06 = p.catch(() => Promise.resolve(1));
+
+const p10 = p.then();
+
+const p20 = p.then(undefined);
+const p21 = p.then(() => 1);
+const p22 = p.then(() => {});
+const p23 = p.then(() => {throw 1});
+const p24 = p.then(() => Promise.resolve(1));
+const p25 = p.then(() => Promise.reject(1));
+
+const p30 = p.then(undefined, undefined);
+const p31 = p.then(undefined, () => 1);
+const p32 = p.then(undefined, () => {});
+const p33 = p.then(undefined, () => {throw 1});
+const p34 = p.then(undefined, () => Promise.resolve(1));
+const p35 = p.then(undefined, () => Promise.reject(1));
+
+const p40 = p.then(() => "1", undefined);
+const p41 = p.then(() => "1", () => 1);
+const p42 = p.then(() => "1", () => {});
+const p43 = p.then(() => "1", () => {throw 1});
+const p44 = p.then(() => "1", () => Promise.resolve(1));
+const p45 = p.then(() => "1", () => Promise.reject(1));
+
+const p50 = p.then(() => {}, undefined);
+const p51 = p.then(() => {}, () => 1);
+const p52 = p.then(() => {}, () => {});
+const p53 = p.then(() => {}, () => {throw 1});
+const p54 = p.then(() => {}, () => Promise.resolve(1));
+const p55 = p.then(() => {}, () => Promise.reject(1));
+
+const p60 = p.then(() => {throw 1}, undefined);
+const p61 = p.then(() => {throw 1}, () => 1);
+const p62 = p.then(() => {throw 1}, () => {});
+const p63 = p.then(() => {throw 1}, () => {throw 1});
+const p64 = p.then(() => {throw 1}, () => Promise.resolve(1));
+const p65 = p.then(() => {throw 1}, () => Promise.reject(1));
+
+const p70 = p.then(() => Promise.resolve("1"), undefined);
+const p71 = p.then(() => Promise.resolve("1"), () => 1);
+const p72 = p.then(() => Promise.resolve("1"), () => {});
+const p73 = p.then(() => Promise.resolve("1"), () => {throw 1});
+const p74 = p.then(() => Promise.resolve("1"), () => Promise.resolve(1));
+const p75 = p.then(() => Promise.resolve("1"), () => Promise.reject(1));
+
+const p80 = p.then(() => Promise.reject(1), undefined);
+const p81 = p.then(() => Promise.reject(1), () => 1);
+const p82 = p.then(() => Promise.reject(1), () => {});
+const p83 = p.then(() => Promise.reject(1), () => {throw 1});
+const p84 = p.then(() => Promise.reject(1), () => Promise.resolve(1));
+const p85 = p.then(() => Promise.reject(1), () => Promise.reject(1));
\ No newline at end of file