Skip to content

Commit b766a66

Browse files
style(typings): Added enhanced typings for combineLatest
1 parent 5fd05a2 commit b766a66

File tree

4 files changed

+48
-11
lines changed

4 files changed

+48
-11
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: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,31 @@ import {TimeInterval} from './operator/extended/timeInterval';
1111
import {ObservableInput, 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>(v2: ObservableInput<T2>): Observable<[T, T2]>;
18+
<T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<[T, T2, T3]>;
19+
<T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<[T, T2, T3, T4]>;
20+
<T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<[T, T2, T3, T4, T5]>;
21+
<T2, T3, T4, T5, T6>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>): Observable<[T, T2, T3, T4, T5, T6]>;
22+
<T2>(array: [ObservableInput<T2>]): Observable<[T, T2]>;
23+
<T2, T3>(array: [ObservableInput<T2>, ObservableInput<T3>]): Observable<[T, T2, T3]>;
24+
<T2, T3, T4>(array: [ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4>]): Observable<[T, T2, T3, T4]>;
25+
<T2, T3, T4, T5>(array: [ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4>, ObservableInput<T5>]): Observable<[T, T2, T3, T4, T5]>;
26+
<T2, T3, T4, T5, T6>(array: [ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4>, ObservableInput<T5>, ObservableInput<T6>]): Observable<[T, T2, T3, T4, T5, T6]>;
27+
<T2, TResult>(v2: ObservableInput<T2>, project: (v1: T, v2: T2) => TResult): Observable<TResult>;
28+
<T2, T3, TResult>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;
29+
<T2, T3, T4, TResult>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;
30+
<T2, T3, T4, T5, TResult>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;
31+
<T2, T3, T4, T5, T6, TResult>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;
32+
<T2, TResult>(array: [ObservableInput<T2>], project: (v1: T, v2: T2) => TResult): Observable<TResult>;
33+
<T2, T3, TResult>(array: [ObservableInput<T2>, ObservableInput<T3>], project: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;
34+
<T2, T3, T4, TResult>(array: [ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4>], project: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;
35+
<T2, T3, T4, T5, TResult>(array: [ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4>, ObservableInput<T5>], project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;
36+
<T2, T3, T4, T5, T6, TResult>(array: [ObservableInput<T2>, ObservableInput<T3>, ObservableInput<T4>, ObservableInput<T5>, ObservableInput<T6>], project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;
37+
<TResult>(array: ObservableInput<any>[], project?: Function): Observable<TResult[]>;
38+
(...observables: Array<ObservableInput<T>>): Observable<T[]>;
39+
<R>(...observables: Array<ObservableInput<T> | ((...values: Array<T>) => R)>): Observable<R>;
40+
}
1441
/* ||| MARKER ||| */

src/operator/combineLatest.ts

Lines changed: 15 additions & 3 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,29 @@ 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+
export function combineLatest<T, TResult>(project: (v1: T) => TResult): Observable<TResult>;
18+
export function combineLatest<T, TResult>(project: (v1: T) => TResult): Observable<TResult>;
19+
/*-- *compute 2-6* export function combineLatest<T, {|X|}>({|v|: ObservableInput<|X|>}): Observable<[T, {|X|}]>; --*/
20+
/*-- *compute 2-6* export function combineLatest<T, {|X|}>(array: [{ObservableInput<|X|>}]): Observable<[T, {|X|}]>; --*/
21+
/*-- *compute 2-6* export function combineLatest<T, {|X|}, TResult>({|v|: ObservableInput<|X|>},
22+
project: (v1: T, {|v|: |X|}) => TResult): Observable<TResult>; --*/
23+
/*-- *compute 2-6* export function combineLatest<T, {|X|}, TResult>(array: [{ObservableInput<|X|>}],
24+
project: (v1: T, {|v|: |X|}) => TResult): Observable<TResult>; --*/
25+
export function combineLatest<T, TResult>(array: ObservableInput<any>[], project?: Function): Observable<TResult[]>;
26+
export function combineLatest<T>(...observables: Array<ObservableInput<T>>): Observable<T[]>;
27+
export function combineLatest<T, R>(...observables: Array<ObservableInput<T> | ((...values: Array<T>) => R)>): Observable<R>;
28+
export function combineLatest<R>(...observables: Array<any | Observable<any> |
1729
Array<Observable<any>> |
1830
((...values: Array<any>) => R)>): Observable<R> {
19-
let project: (...values: Array<any>) => R = null;
31+
let project: (...values: Array<any>) => R = null;
2032
if (typeof observables[observables.length - 1] === 'function') {
2133
project = <(...values: Array<any>) => R>observables.pop();
2234
}
2335

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

3042
observables.unshift(this);

0 commit comments

Comments
 (0)