Skip to content

Commit 5aea50e

Browse files
committed
fix(types): support union types passed to defer
1 parent e2878af commit 5aea50e

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

spec-dtslint/observables/defer-spec.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@ import { of, defer } from 'rxjs';
33
it('should enforce function parameter', () => {
44
const a = defer(); // $ExpectError
55
});
6-
6+
77
it('should infer correctly with function return observable', () => {
88
const a = defer(() => of(1, 2, 3)); // $ExpectType Observable<number>
99
});
1010

1111
it('should infer correctly with function return promise', () => {
1212
const a = defer(() => Promise.resolve(5)); // $ExpectType Observable<number>
1313
});
14+
15+
it('should support union type returns', () => {
16+
const a = defer(() => Math.random() > 0.5 ? of(123) : of('abc')); // $ExpectType Observable<string | number>
17+
});

src/internal/observable/defer.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Observable } from '../Observable';
2-
import { SubscribableOrPromise } from '../types';
2+
import { SubscribableOrPromise, ObservedValueOf, ObservableInput } from '../types';
33
import { from } from './from'; // lol
44
import { empty } from './empty';
55

@@ -50,9 +50,9 @@ import { empty } from './empty';
5050
* @name defer
5151
* @owner Observable
5252
*/
53-
export function defer<T>(observableFactory: () => SubscribableOrPromise<T> | void): Observable<T> {
54-
return new Observable(subscriber => {
55-
let input: SubscribableOrPromise<T> | void;
53+
export function defer<O extends ObservableInput<any>>(observableFactory: () => O | void): Observable<ObservedValueOf<O>> {
54+
return new Observable<ObservedValueOf<O>>(subscriber => {
55+
let input: O | void;
5656
try {
5757
input = observableFactory();
5858
} catch (err) {
@@ -62,4 +62,4 @@ export function defer<T>(observableFactory: () => SubscribableOrPromise<T> | voi
6262
const source = input ? from(input) : empty();
6363
return source.subscribe(subscriber);
6464
});
65-
}
65+
}

src/internal/observable/iif.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,5 @@ export function iif<T, F>(
9494
trueResult: SubscribableOrPromise<T> = EMPTY,
9595
falseResult: SubscribableOrPromise<F> = EMPTY
9696
): Observable<T|F> {
97-
return defer<T|F>(() => condition() ? trueResult : falseResult);
97+
return defer(() => condition() ? trueResult : falseResult);
9898
}

0 commit comments

Comments
 (0)