Skip to content

Commit 40a2209

Browse files
cartantbenlesh
authored andcommittedJun 6, 2019
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
1 parent e4f2d23 commit 40a2209

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed
 

‎spec-dtslint/observables/defer-spec.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,12 @@ it('should support union type returns', () => {
1818

1919
it('should infer correctly with void functions', () => {
2020
const a = defer(() => {}); // $ExpectType Observable<never>
21-
});
21+
});
22+
23+
it('should error if an ObservableInput is not returned', () => {
24+
const a = defer(() => 42); // $ExpectError
25+
});
26+
27+
it('should infer correctly with functions that sometimes do not return an ObservableInput', () => {
28+
const a = defer(() => { if (Math.random() < 0.5) { return of(42); } }); // $ExpectType Observable<number>
29+
});

‎src/internal/observable/defer.ts

+4-6
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,16 @@ import { empty } from './empty';
5252
* @name defer
5353
* @owner Observable
5454
*/
55-
export function defer<O extends ObservableInput<any>>(observableFactory: () => O): Observable<ObservedValueOf<O>>;
56-
export function defer(observableFactory: () => void): Observable<never>;
57-
export function defer<O extends ObservableInput<any>>(observableFactory: () => O | void): Observable<ObservedValueOf<O>> {
58-
return new Observable<ObservedValueOf<O>>(subscriber => {
59-
let input: O | void;
55+
export function defer<R extends ObservableInput<any> | void>(observableFactory: () => R): Observable<ObservedValueOf<R>> {
56+
return new Observable<ObservedValueOf<R>>(subscriber => {
57+
let input: R | void;
6058
try {
6159
input = observableFactory();
6260
} catch (err) {
6361
subscriber.error(err);
6462
return undefined;
6563
}
66-
const source = input ? from(input) : empty();
64+
const source = input ? from(input as ObservableInput<ObservedValueOf<R>>) : empty();
6765
return source.subscribe(subscriber);
6866
});
6967
}

0 commit comments

Comments
 (0)
Please sign in to comment.