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); }); }