From 40a2209636a8b4d4884f5d59ad206ae458ad2de4 Mon Sep 17 00:00:00 2001 From: Nicholas Jamieson Date: Fri, 7 Jun 2019 03:15:22 +1000 Subject: [PATCH] fix(defer): restrict allowed factory types (#4835) * test(defer): add failing dtslint test * fix(defer): restrict allowed factory types * test(defer): add a sometimes-returns dtslint test --- spec-dtslint/observables/defer-spec.ts | 10 +++++++++- src/internal/observable/defer.ts | 10 ++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/spec-dtslint/observables/defer-spec.ts b/spec-dtslint/observables/defer-spec.ts index cc0c2f1092..42aa3a672b 100644 --- a/spec-dtslint/observables/defer-spec.ts +++ b/spec-dtslint/observables/defer-spec.ts @@ -18,4 +18,12 @@ it('should support union type returns', () => { it('should infer correctly with void functions', () => { const a = defer(() => {}); // $ExpectType Observable -}); \ No newline at end of file +}); + +it('should error if an ObservableInput is not returned', () => { + const a = defer(() => 42); // $ExpectError +}); + +it('should infer correctly with functions that sometimes do not return an ObservableInput', () => { + const a = defer(() => { if (Math.random() < 0.5) { return of(42); } }); // $ExpectType Observable +}); diff --git a/src/internal/observable/defer.ts b/src/internal/observable/defer.ts index e592536935..df6c7aa604 100644 --- a/src/internal/observable/defer.ts +++ b/src/internal/observable/defer.ts @@ -52,18 +52,16 @@ import { empty } from './empty'; * @name defer * @owner Observable */ -export function defer>(observableFactory: () => O): Observable>; -export function defer(observableFactory: () => void): Observable; -export function defer>(observableFactory: () => O | void): Observable> { - return new Observable>(subscriber => { - let input: O | void; +export function defer | void>(observableFactory: () => R): Observable> { + return new Observable>(subscriber => { + let input: R | void; try { input = observableFactory(); } catch (err) { subscriber.error(err); return undefined; } - const source = input ? from(input) : empty(); + const source = input ? from(input as ObservableInput>) : empty(); return source.subscribe(subscriber); }); }