Skip to content

Commit 40c3d9f

Browse files
authored
fix(combineLatest): improve typings for combineLatest (#4470)
* fix(combineLatest): improve typings for combineLatest Existing typings did a poor job of getting proper types from code that passed an array of observables or observable inputs to combineLatest. This issue was caught while trying master in google3. This resolves that issue. * fixup! fix(combineLatest): improve typings for combineLatest
1 parent 0042846 commit 40c3d9f

File tree

3 files changed

+89
-5
lines changed

3 files changed

+89
-5
lines changed

spec-dtslint/observables/combineLatest-spec.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,63 @@ it('should accept 6 params and a result selector', () => {
7777
it('should accept 7 or more params and a result selector', () => {
7878
const o = combineLatest(a, b, c, d, e, f, g, g, g, () => new A()); // $ExpectType Observable<A>
7979
});
80+
81+
it('should accept 1 param', () => {
82+
const o = combineLatest([a]); // $ExpectType Observable<[A]>
83+
});
84+
85+
it('should accept 2 params', () => {
86+
const o = combineLatest([a, b]); // $ExpectType Observable<[A, B]>
87+
});
88+
89+
it('should accept 3 params', () => {
90+
const o = combineLatest([a, b, c]); // $ExpectType Observable<[A, B, C]>
91+
});
92+
93+
it('should accept 4 params', () => {
94+
const o = combineLatest([a, b, c, d]); // $ExpectType Observable<[A, B, C, D]>
95+
});
96+
97+
it('should accept 5 params', () => {
98+
const o = combineLatest([a, b, c, d, e]); // $ExpectType Observable<[A, B, C, D, E]>
99+
});
100+
101+
it('should accept 6 params', () => {
102+
const o = combineLatest([a, b, c, d, e, f]); // $ExpectType Observable<[A, B, C, D, E, F]>
103+
});
104+
105+
it('should have basic support for 7 or more params', () => {
106+
const o = combineLatest([a, b, c, d, e, f, g]); // $ExpectType Observable<(A | B | C | D | E | F | G)[]>
107+
});
108+
109+
it('should handle an array of Observables', () => {
110+
const o = combineLatest([a, a, a, a, a, a, a, a, a, a, a]); // $ExpectType Observable<A[]>
111+
});
112+
113+
it('should accept 1 param and a result selector', () => {
114+
const o = combineLatest([a], (a: A) => new A()); // $ExpectType Observable<A>
115+
});
116+
117+
it('should accept 2 params and a result selector', () => {
118+
const o = combineLatest([a, b], (a: A, b: B) => new A()); // $ExpectType Observable<A>
119+
});
120+
121+
it('should accept 3 params and a result selector', () => {
122+
const o = combineLatest([a, b, c], (a: A, b: B, c: C) => new A()); // $ExpectType Observable<A>
123+
});
124+
125+
it('should accept 4 params and a result selector', () => {
126+
const o = combineLatest([a, b, c, d], (a: A, b: B, c: C, d: D) => new A()); // $ExpectType Observable<A>
127+
});
128+
129+
it('should accept 5 params and a result selector', () => {
130+
const o = combineLatest([a, b, c, d, e], (a: A, b: B, c: C, d: D, e: E) => new A()); // $ExpectType Observable<A>
131+
});
132+
133+
it('should accept 6 params and a result selector', () => {
134+
const o = combineLatest([a, b, c, d, e, f], (a: A, b: B, c: C, d: D, e: E, f: F) => new A()); // $ExpectType Observable<A>
135+
});
136+
137+
it('should accept 7 or more params and a result selector', () => {
138+
const o = combineLatest([a, b, c, d, e, f, g, g, g], (a: any, b: any, c: any, d: any, e: any, f: any, g1: any, g2: any, g3: any) => new A()); // $ExpectType Observable<A>
139+
});

spec-dtslint/observables/from-spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,5 @@ it('should accept an array of Inputs', () => {
4141
yield 42;
4242
}());
4343

44-
const o = from([of(1), ['test'], iterable]); // $ExpectType Observable<Observable<number> | IterableIterator<number> | string[]>
44+
const o = from([of(1), ['test'], iterable]); // $ExpectType Observable<IterableIterator<number> | Observable<number> | string[]>
4545
});

src/internal/observable/combineLatest.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,24 @@ import { fromArray } from './fromArray';
1212
const NONE = {};
1313

1414
/* tslint:disable:max-line-length */
15+
16+
// If called with a single array, it "auto-spreads" the array, with result selector
17+
/** @deprecated resultSelector no longer supported, pipe to map instead */
18+
export function combineLatest<O1 extends ObservableInput<any>, R>(sources: [O1], resultSelector: (v1: ObservedValueOf<O1>) => R, scheduler?: SchedulerLike): Observable<R>;
19+
/** @deprecated resultSelector no longer supported, pipe to map instead */
20+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, R>(sources: [O1, O2], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>) => R, scheduler?: SchedulerLike): Observable<R>;
21+
/** @deprecated resultSelector no longer supported, pipe to map instead */
22+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, R>(sources: [O1, O2, O3], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>) => R, scheduler?: SchedulerLike): Observable<R>;
23+
/** @deprecated resultSelector no longer supported, pipe to map instead */
24+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>) => R, scheduler?: SchedulerLike): Observable<R>;
25+
/** @deprecated resultSelector no longer supported, pipe to map instead */
26+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4, O5], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>) => R, scheduler?: SchedulerLike): Observable<R>;
27+
/** @deprecated resultSelector no longer supported, pipe to map instead */
28+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(sources: [O1, O2, O3, O4, O5, O6], resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R, scheduler?: SchedulerLike): Observable<R>;
29+
/** @deprecated resultSelector no longer supported, pipe to map instead */
30+
export function combineLatest<O extends ObservableInput<any>, R>(sources: O[], resultSelector: (...args: ObservedValueOf<O>[]) => R, scheduler?: SchedulerLike): Observable<R>;
31+
32+
// standard call, but with a result selector
1533
/** @deprecated resultSelector no longer supported, pipe to map instead */
1634
export function combineLatest<O1 extends ObservableInput<any>, R>(v1: O1, resultSelector: (v1: ObservedValueOf<O1>) => R, scheduler?: SchedulerLike): Observable<R>;
1735
/** @deprecated resultSelector no longer supported, pipe to map instead */
@@ -25,19 +43,25 @@ export function combineLatest<O1 extends ObservableInput<any>, O2 extends Observ
2543
/** @deprecated resultSelector no longer supported, pipe to map instead */
2644
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, resultSelector: (v1: ObservedValueOf<O1>, v2: ObservedValueOf<O2>, v3: ObservedValueOf<O3>, v4: ObservedValueOf<O4>, v5: ObservedValueOf<O5>, v6: ObservedValueOf<O6>) => R, scheduler?: SchedulerLike): Observable<R>;
2745

46+
// If called with a single array, it "auto-spreads" the array.
47+
export function combineLatest<O1 extends ObservableInput<any>>(sources: [O1], scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>]>;
48+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(sources: [O1, O2], scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
49+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(sources: [O1, O2, O3], scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
50+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(sources: [O1, O2, O3, O4], scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
51+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5], scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
52+
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(sources: [O1, O2, O3, O4, O5, O6], scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
53+
export function combineLatest<O extends ObservableInput<any>>(sources: O[], scheduler?: SchedulerLike): Observable<ObservedValueOf<O>[]>;
54+
55+
// Standard calls
2856
export function combineLatest<O1 extends ObservableInput<any>>(v1: O1, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>]>;
2957
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>>(v1: O1, v2: O2, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>]>;
3058
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>]>;
3159
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>]>;
3260
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>]>;
3361
export function combineLatest<O1 extends ObservableInput<any>, O2 extends ObservableInput<any>, O3 extends ObservableInput<any>, O4 extends ObservableInput<any>, O5 extends ObservableInput<any>, O6 extends ObservableInput<any>>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, scheduler?: SchedulerLike): Observable<[ObservedValueOf<O1>, ObservedValueOf<O2>, ObservedValueOf<O3>, ObservedValueOf<O4>, ObservedValueOf<O5>, ObservedValueOf<O6>]>;
3462

35-
export function combineLatest<O extends ObservableInput<any>>(array: O[], scheduler?: SchedulerLike): Observable<ObservedValueOf<O>[]>;
36-
export function combineLatest<R>(array: ObservableInput<any>[], scheduler?: SchedulerLike): Observable<R>;
3763
/** @deprecated resultSelector no longer supported, pipe to map instead */
3864
export function combineLatest<O extends ObservableInput<any>, R>(array: O[], resultSelector: (...values: ObservedValueOf<O>[]) => R, scheduler?: SchedulerLike): Observable<R>;
39-
/** @deprecated resultSelector no longer supported, pipe to map instead */
40-
export function combineLatest<R>(array: ObservableInput<any>[], resultSelector: (...values: Array<any>) => R, scheduler?: SchedulerLike): Observable<R>;
4165
export function combineLatest<O extends ObservableInput<any>>(...observables: Array<O | SchedulerLike>): Observable<any[]>;
4266
export function combineLatest<O extends ObservableInput<any>, R>(...observables: Array<O | ((...values: ObservedValueOf<O>[]) => R) | SchedulerLike>): Observable<R>;
4367
export function combineLatest<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R) | SchedulerLike>): Observable<R>;

0 commit comments

Comments
 (0)