From b1c35738204b5b1a5d325a16e70cdbf25b523976 Mon Sep 17 00:00:00 2001 From: John Chadwick Date: Thu, 23 Jan 2020 07:12:22 -0800 Subject: [PATCH] fix(toPromise): correct toPromise return type (#5072) * fix(toPromise): correct toPromise return type * fix(toPromise): add test for toPromise type BREAKING CHANGE: toPromise return type now returns `T | undefined` in TypeScript, which is correct, but may break builds. --- spec-dtslint/Observable-spec.ts | 4 ++++ src/internal/Observable.ts | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/spec-dtslint/Observable-spec.ts b/spec-dtslint/Observable-spec.ts index ee7c1b1053..3033f6f1bf 100644 --- a/spec-dtslint/Observable-spec.ts +++ b/spec-dtslint/Observable-spec.ts @@ -126,4 +126,8 @@ describe('pipe', () => { const customOperator = () => (a: Observable) => a; const o = of('foo').pipe(customOperator()); // $ExpectType Observable }); + + it('should have proper return type for toPromise', () => { + const o = of('foo').toPromise(); // $ExpectType Promise + }); }); diff --git a/src/internal/Observable.ts b/src/internal/Observable.ts index fbea2874ab..02c96a79e7 100644 --- a/src/internal/Observable.ts +++ b/src/internal/Observable.ts @@ -347,9 +347,9 @@ export class Observable implements Subscribable { } /* tslint:disable:max-line-length */ - toPromise(this: Observable): Promise; - toPromise(this: Observable, PromiseCtor: typeof Promise): Promise; - toPromise(this: Observable, PromiseCtor: PromiseConstructorLike): Promise; + toPromise(this: Observable): Promise; + toPromise(this: Observable, PromiseCtor: typeof Promise): Promise; + toPromise(this: Observable, PromiseCtor: PromiseConstructorLike): Promise; /* tslint:enable:max-line-length */ /** @@ -362,13 +362,13 @@ export class Observable implements Subscribable { * @return A Promise that resolves with the last value emit, or * rejects on an error. */ - toPromise(promiseCtor?: PromiseConstructorLike): Promise { + toPromise(promiseCtor?: PromiseConstructorLike): Promise { promiseCtor = getPromiseCtor(promiseCtor); return new promiseCtor((resolve, reject) => { - let value: any; + let value: T | undefined; this.subscribe((x: T) => value = x, (err: any) => reject(err), () => resolve(value)); - }) as Promise; + }) as Promise; } }