diff --git a/types/when/index.d.ts b/types/when/index.d.ts index 3736cfa7dd..0b016a9ea0 100644 --- a/types/when/index.d.ts +++ b/types/when/index.d.ts @@ -285,11 +285,11 @@ declare namespace When { // be a constructor with prototype set to an instance of Error. otherwise(exceptionType: any, onRejected?: (reason: any) => U | Promise): Promise; - then( - onFulfilled?: ((value: T) => T | Thenable) | undefined | null, - onRejected?: ((reason: any) => T | Thenable) | undefined | null, + then( + onFulfilled: ((value: T) => TResult1 | Thenable), + onRejected: ((reason: any) => TResult2 | Thenable), onProgress?: (update: any) => void - ): Promise; + ): Promise; then( onFulfilled: ((value: T) => TResult | Thenable), onRejected?: ((reason: any) => TResult | Thenable) | undefined | null, @@ -300,11 +300,11 @@ declare namespace When { onRejected: ((reason: any) => TResult | Thenable), onProgress?: (update: any) => void ): Promise; - then( - onFulfilled: ((value: T) => TResult1 | Thenable), - onRejected: ((reason: any) => TResult2 | Thenable), + then( + onFulfilled?: ((value: T) => T | Thenable) | undefined | null, + onRejected?: ((reason: any) => T | Thenable) | undefined | null, onProgress?: (update: any) => void - ): Promise; + ): Promise; spread(onFulfilled: _.Fn0 | T>): Promise; spread(onFulfilled: _.Fn1 | T>): Promise; diff --git a/types/when/tsconfig.json b/types/when/tsconfig.json index 2162d713fc..84a5f78c14 100644 --- a/types/when/tsconfig.json +++ b/types/when/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "module": "commonjs", + "target": "es5", "lib": [ "es6" ], diff --git a/types/when/when-tests.ts b/types/when/when-tests.ts index d44752b950..e1e3f0fd7c 100644 --- a/types/when/when-tests.ts +++ b/types/when/when-tests.ts @@ -14,9 +14,24 @@ class ForeignPromise { then(onFulfilled?: (value: T) => T, onRejected?: (reason: any) => T): ForeignPromise { return new ForeignPromise(onFulfilled ? onFulfilled(this.value) : this.value); } -}; +} + +interface IData { + timestamp: number; +} + +class Data implements IData { + timestamp: number; + date: Date; + + constructor({ timestamp }: IData) { + this.timestamp = timestamp; + this.date = new Date(timestamp); + } +} var promise: when.Promise; +var promise2: when.Promise; var foreign = new ForeignPromise(1); var error = new Error("boom!"); var example: () => void; @@ -222,6 +237,17 @@ promise = when(1).then(undefined, (err: any) => 2); promise = when(1).then((val: number) => val + val, (err: any) => 2); promise = when(1).then((val: number) => when(val + val), (err: any) => 2); +promise = when('1').then((val: string) => parseInt(val)); + +// Tests for when TResult is a subtype of T +const subData: IData = { timestamp: Date.now() }; +const errorData: Data = new Data({ timestamp: -1 }); + +promise2 = when(subData).then((val: IData) => new Data(val)); +promise2 = when(subData).then((val: IData) => when(new Data(val))); +promise2 = when(subData).then((val: IData) => new Data(val), (err: any) => errorData); +promise2 = when(subData).then((val: IData) => when(new Data(val)), (err: any) => errorData); + /* promise.spread(onFulfilledArray) */ promise = when([]).spread(() => 2);