Skip to content

Commit 01acce0

Browse files
style(typings): Added enhanced typings for combineLatest
1 parent c991a7b commit 01acce0

File tree

4 files changed

+71
-13
lines changed

4 files changed

+71
-13
lines changed

src/CoreOperators.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export interface CoreOperators<T> {
1616
bufferWhen?: (closingSelector: () => Observable<any>) => Observable<T[]>;
1717
catch?: (selector: (err: any, source: Observable<T>, caught: Observable<any>) => Observable<any>) => Observable<T>;
1818
combineAll?: <R>(project?: (...values: Array<any>) => R) => Observable<R>;
19-
combineLatest?: <R>(...observables: Array<Observable<any> | ((...values: Array<any>) => R)>) => Observable<R>;
19+
combineLatest: operator.operator_proto_combineLatest<T>;
2020
concat?: <R>(...observables: (Observable<any> | Scheduler)[]) => Observable<R>;
2121
concatAll?: () => Observable<T>;
2222
concatMap?: <R>(project: ((x: T, ix: number) => Observable<any>), projectResult?: (x: T, y: any, ix: number, iy: number) => R) => Observable<R>;

src/Observable.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ import {combineLatest as combineLatestStatic} from './operator/combineLatest-sta
1919
import {concat as concatStatic} from './operator/concat-static';
2020
import {merge as mergeStatic} from './operator/merge-static';
2121
import {zip as zipStatic} from './operator/zip-static';
22-
import {BoundCallbackObservable} from './observable/bindCallback';
2322
import {DeferObservable} from './observable/defer';
2423
import {EmptyObservable} from './observable/empty';
2524
import {ForkJoinObservable} from './observable/forkJoin';
2625
import {FromObservable} from './observable/from';
26+
import {CallbackObservable} from './observable/fromCallback';
2727
import {ArrayObservable} from './observable/fromArray';
2828
import {FromEventObservable} from './observable/fromEvent';
2929
import {FromEventPatternObservable} from './observable/fromEventPattern';
@@ -178,7 +178,7 @@ export class Observable<T> implements CoreOperators<T> {
178178
}
179179

180180
// static method stubs
181-
static bindCallback: typeof BoundCallbackObservable.create;
181+
static bindCallback: typeof CallbackObservable.create;
182182
static combineLatest: typeof combineLatestStatic;
183183
static concat: typeof concatStatic;
184184
static defer: typeof DeferObservable.create;
@@ -206,9 +206,7 @@ export class Observable<T> implements CoreOperators<T> {
206206
bufferWhen: (closingSelector: () => Observable<any>) => Observable<T[]>;
207207
catch: (selector: (err: any, source: Observable<T>, caught: Observable<any>) => Observable<any>) => Observable<T>;
208208
combineAll: <R>(project?: (...values: Array<any>) => R) => Observable<R>;
209-
combineLatest: <R>(...observables: Array<Observable<any> |
210-
Array<Observable<any>> |
211-
((...values: Array<any>) => R)>) => Observable<R>;
209+
combineLatest: operator.operator_proto_combineLatest<T>;
212210
concat: <R>(...observables: (Observable<any> | Scheduler)[]) => Observable<R>;
213211
concatAll: () => Observable<any>;
214212
concatMap: <R>(project: ((x: T, ix: number) => Observable<any>), projectResult?: (x: T, y: any, ix: number, iy: number) => R) => Observable<R>;
@@ -269,9 +267,9 @@ export class Observable<T> implements CoreOperators<T> {
269267
startWith: (x: T) => Observable<T>;
270268
subscribeOn: (scheduler: Scheduler, delay?: number) => Observable<T>;
271269
switch: <R>() => Observable<R>;
272-
exhaust: <T>() => Observable<T>;
270+
switchFirst: <T>() => Observable<T>;
273271
switchMap: <R>(project: ((x: T, ix: number) => Observable<any>), projectResult?: (x: T, y: any, ix: number, iy: number) => R) => Observable<R>;
274-
exhaustMap: <T, R, R2>(project: (x: T, ix: number) => Observable<R>, rSelector?: (x: T, y: R, ix: number, iy: number) => R2) => Observable<R>;
272+
switchFirstMap: <T, R, R2>(project: (x: T, ix: number) => Observable<R>, rSelector?: (x: T, y: R, ix: number, iy: number) => R2) => Observable<R>;
275273
switchMapTo: <R>(observable: Observable<any>, projectResult?: (x: T, y: any, ix: number, iy: number) => R) => Observable<R>;
276274
take: (count: number) => Observable<T>;
277275
takeUntil: (notifier: Observable<any>) => Observable<T>;

src/operator-typings.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,23 @@ import {TimeInterval} from './operator/extended/timeInterval';
1111
import {ObservableOrPromise, ArrayOrIterator, _Selector, _IndexSelector, _SwitchMapResultSelector, _ObservableMergeMapProjector, _IteratorMergeMapProjector, _Predicate, _PredicateObservable, _Comparer, _Accumulator, _MergeAccumulator} from './types';
1212

1313
/* ||| MARKER ||| */
14+
export interface operator_proto_combineLatest<T> {
15+
<TResult>(project: (v1: T) => TResult): Observable<TResult>;
16+
<TResult>(project: (v1: T) => TResult): Observable<TResult>;
17+
<T2>(second: ObservableInput<T2>): Observable<[T, T2]>;
18+
<T2>(array: [ObservableInput<T2>]): Observable<[T, T2]>;
19+
<T2, TResult>(second: ObservableInput<T2>, project: (v1: T, v2: T2) => TResult): Observable<TResult>;
20+
<T2, TResult>(array: [ ObservableInput<T2> ], project: (v1: T, v2: T2) => TResult): Observable<TResult>;
21+
<T2, T3>(second: ObservableInput<T2>, third: ObservableInput<T3>): Observable<[T, T2, T3]>;
22+
<T2, T3>(array: [ ObservableInput<T2>, ObservableInput<T3> ]): Observable<[T, T2, T3]>;
23+
<T2, T3, TResult>(second: ObservableInput<T2>, third: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;
24+
<T2, T3, TResult>(array: [ObservableInput<T2>, ObservableInput<T3>], project: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;
25+
<T2, T3, T4>(second: ObservableInput<T2>, third: ObservableInput<T3>, forth: ObservableInput<T4>): Observable<[T, T2, T3, T4]>;
26+
<T2, T3, T4>(array: [ ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4> ]): Observable<[T, T2, T3, T4]>;
27+
<T2, T3, T4, TResult>(second: ObservableInput<T2>, third: ObservableInput<T3>, forth: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;
28+
<T2, T3, T4, TResult>(array: [ ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4> ], project: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;
29+
<TResult>(array: ObservableInput<any>[], project?: Function): Observable<TResult[]>;
30+
(...observables: Array<ObservableInput<T>>): Observable<T[]>;
31+
<R>(...observables: Array<ObservableInput<T> | ((...values: Array<T>) => R)>): Observable<R>;
32+
}
1433
/* ||| MARKER ||| */

src/operator/combineLatest.ts

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {Observable} from '../Observable';
22
import {ArrayObservable} from '../observable/fromArray';
33
import {CombineLatestOperator} from './combineLatest-support';
44
import {isArray} from '../util/isArray';
5+
import {ObservableInput} from '../types';
56

67
/**
78
* Combines the values from this observable with values from observables passed as arguments. This is done by subscribing
@@ -13,18 +14,58 @@ import {isArray} from '../util/isArray';
1314
* @returns {Observable} an observable of other projected values from the most recent values from each observable, or an array of each of
1415
* the most recent values from each observable.
1516
*/
16-
export function combineLatest<R>(...observables: Array<Observable<any> |
17-
Array<Observable<any>> |
18-
((...values: Array<any>) => R)>): Observable<R> {
19-
let project: (...values: Array<any>) => R = null;
17+
export function combineLatest<T, TResult>(project: (v1: T) => TResult): Observable<TResult>;
18+
export function combineLatest<T, TResult>(project: (v1: T) => TResult): Observable<TResult>;
19+
export function combineLatest<T, T2>(second: ObservableInput<T2>): Observable<[T, T2]>;
20+
export function combineLatest<T, T2>(array: [ObservableInput<T2>]): Observable<[T, T2]>;
21+
export function combineLatest<T, T2, TResult>(second: ObservableInput<T2>,
22+
project: (v1: T, v2: T2) => TResult): Observable<TResult>;
23+
export function combineLatest<T, T2, TResult>(array: [
24+
ObservableInput<T2>
25+
], project: (v1: T, v2: T2) => TResult): Observable<TResult>;
26+
export function combineLatest<T, T2, T3>(second: ObservableInput<T2>, third: ObservableInput<T3>): Observable<[T, T2, T3]>;
27+
export function combineLatest<T, T2, T3>(array: [
28+
ObservableInput<T2>,
29+
ObservableInput<T3>
30+
]): Observable<[T, T2, T3]>;
31+
export function combineLatest<T, T2, T3, TResult>(second: ObservableInput<T2>,
32+
third: ObservableInput<T3>,
33+
project: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;
34+
export function combineLatest<T, T2, T3, TResult>(array: [ObservableInput<T2>, ObservableInput<T3>],
35+
project: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;
36+
export function combineLatest<T, T2, T3, T4>(second: ObservableInput<T2>,
37+
third: ObservableInput<T3>,
38+
forth: ObservableInput<T4>): Observable<[T, T2, T3, T4]>;
39+
export function combineLatest<T, T2, T3, T4>(array: [
40+
ObservableInput<T2>,
41+
ObservableInput<T3>,
42+
ObservableInput<T4>
43+
]): Observable<[T, T2, T3, T4]>;
44+
export function combineLatest<T, T2, T3, T4, TResult>(second: ObservableInput<T2>,
45+
third: ObservableInput<T3>,
46+
forth: ObservableInput<T4>,
47+
project: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;
48+
export function combineLatest<T, T2, T3, T4, TResult>(array: [
49+
ObservableInput<T2>,
50+
ObservableInput<T3>,
51+
ObservableInput<T4>
52+
],
53+
project: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;
54+
export function combineLatest<T, TResult>(array: ObservableInput<any>[], project?: Function): Observable<TResult[]>;
55+
export function combineLatest<T>(...observables: Array<ObservableInput<T>>): Observable<T[]>;
56+
export function combineLatest<T, R>(...observables: Array<ObservableInput<T> | ((...values: Array<T>) => R)>): Observable<R>;
57+
export function combineLatest<R>(...observables: Array<any | Observable<any> |
58+
Array<Promise<any>> |
59+
((...values: Array<any>) => R)>): Observable<R> {
60+
let project: (...values: Array<any>) => R = null;
2061
if (typeof observables[observables.length - 1] === 'function') {
2162
project = <(...values: Array<any>) => R>observables.pop();
2263
}
2364

2465
// if the first and only other argument besides the resultSelector is an array
2566
// assume it's been called with `combineLatest([obs1, obs2, obs3], project)`
2667
if (observables.length === 1 && isArray(observables[0])) {
27-
observables = <Array<Observable<any>>>observables[0];
68+
observables = <any>observables[0];
2869
}
2970

3071
observables.unshift(this);

0 commit comments

Comments
 (0)