Skip to content

Commit 0d87f52

Browse files
committed
fix(types): support passing union types to zip
1 parent eb1d596 commit 0d87f52

2 files changed

Lines changed: 31 additions & 18 deletions

File tree

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,14 @@ it('should return Array<T> when given a single observable', () => {
3636
consta=of(1);// $ExpectType Observable<number>
3737
consto1=zip(a);// $ExpectType Observable<number[]>
3838
});
39+
40+
it('should support union types',()=>{
41+
constu=Math.random()>0.5 ? of(123) : of('abc');
42+
consto=zip(u,u,u);// $ExpectType Observable<[string | number, string | number, string | number]>
43+
});
44+
45+
it('should support different union types',()=>{
46+
constu=Math.random()>0.5 ? of(123) : of('abc');
47+
constu2=Math.random()>0.5 ? of(true) : of([1,2,3]);
48+
consto=zip(u,u2);// $ExpectType Observable<[string | number, boolean | number[]]>
49+
});

‎src/internal/observable/zip.ts‎

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Observable } from '../Observable';
22
import{fromArray}from'./fromArray';
33
import{isArray}from'../util/isArray';
44
import{Operator}from'../Operator';
5-
import{ObservableInput,PartialObserver}from'../types';
5+
import{ObservableInput,PartialObserver,ObservedValueOf}from'../types';
66
import{Subscriber}from'../Subscriber';
77
import{Subscription}from'../Subscription';
88
import{OuterSubscriber}from'../OuterSubscriber';
@@ -12,33 +12,33 @@ import { iterator as Symbol_iterator } from '../../internal/symbol/iterator';
1212

1313
/* tslint:disable:max-line-length */
1414
/** @deprecated resultSelector is no longer supported, pipe to map instead */
15-
exportfunctionzip<T,R>(v1: ObservableInput<T>,resultSelector: (v1: T)=>R): Observable<R>;
15+
exportfunctionzip<O1extendsObservableInput<any>,R>(v1: O1,resultSelector: (v1: ObservedValueOf<O1>)=>R): Observable<R>;
1616
/** @deprecated resultSelector is no longer supported, pipe to map instead */
17-
exportfunctionzip<T,T2,R>(v1: ObservableInput<T>,v2: ObservableInput<T2>,resultSelector: (v1: T,v2: T2)=>R): Observable<R>;
17+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,R>(v1: O1,v2: O2,resultSelector: (v1: ObservedValueOf<O1>,v2: ObservedValueOf<O2>)=>R): Observable<R>;
1818
/** @deprecated resultSelector is no longer supported, pipe to map instead */
19-
exportfunctionzip<T,T2,T3,R>(v1: ObservableInput<T>,v2: ObservableInput<T2>,v3: ObservableInput<T3>,resultSelector: (v1: T,v2: T2,v3: T3)=>R): Observable<R>;
19+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,O3extendsObservableInput<any>,R>(v1: O1,v2: O2,v3: O3,resultSelector: (v1: ObservedValueOf<O1>,v2: ObservedValueOf<O2>,v3: ObservedValueOf<O3>)=>R): Observable<R>;
2020
/** @deprecated resultSelector is no longer supported, pipe to map instead */
21-
exportfunctionzip<T,T2,T3,T4,R>(v1: ObservableInput<T>,v2: ObservableInput<T2>,v3: ObservableInput<T3>,v4: ObservableInput<T4>,resultSelector: (v1: T,v2: T2,v3: T3,v4: T4)=>R): Observable<R>;
21+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,O3extendsObservableInput<any>,O4extendsObservableInput<any>,R>(v1: O1,v2: O2,v3: O3,v4: O4,resultSelector: (v1: ObservedValueOf<O1>,v2: ObservedValueOf<O2>,v3: ObservedValueOf<O3>,v4: ObservedValueOf<O4>)=>R): Observable<R>;
2222
/** @deprecated resultSelector is no longer supported, pipe to map instead */
23-
exportfunctionzip<T,T2,T3,T4,T5,R>(v1: ObservableInput<T>,v2: ObservableInput<T2>,v3: ObservableInput<T3>,v4: ObservableInput<T4>,v5: ObservableInput<T5>,resultSelector: (v1: T,v2: T2,v3: T3,v4: T4,v5: T5)=>R): Observable<R>;
23+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,O3extendsObservableInput<any>,O4extendsObservableInput<any>,O5extendsObservableInput<any>,R>(v1: O1,v2: O2,v3: O3,v4: O4,v5: O5,resultSelector: (v1: ObservedValueOf<O1>,v2: ObservedValueOf<O2>,v3: ObservedValueOf<O3>,v4: ObservedValueOf<O4>,v5: ObservedValueOf<O5>)=>R): Observable<R>;
2424
/** @deprecated resultSelector is no longer supported, pipe to map instead */
25-
exportfunctionzip<T,T2,T3,T4,T5,T6,R>(v1: ObservableInput<T>,v2: ObservableInput<T2>,v3: ObservableInput<T3>,v4: ObservableInput<T4>,v5: ObservableInput<T5>,v6: ObservableInput<T6>,resultSelector: (v1: T,v2: T2,v3: T3,v4: T4,v5: T5,v6: T6)=>R): Observable<R>;
25+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,O3extendsObservableInput<any>,O4extendsObservableInput<any>,O5extendsObservableInput<any>,O6extendsObservableInput<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): Observable<R>;
2626

27-
exportfunctionzip<T,T2>(v1: ObservableInput<T>,v2: ObservableInput<T2>): Observable<[T,T2]>;
28-
exportfunctionzip<T,T2,T3>(v1: ObservableInput<T>,v2: ObservableInput<T2>,v3: ObservableInput<T3>): Observable<[T,T2,T3]>;
29-
exportfunctionzip<T,T2,T3,T4>(v1: ObservableInput<T>,v2: ObservableInput<T2>,v3: ObservableInput<T3>,v4: ObservableInput<T4>): Observable<[T,T2,T3,T4]>;
30-
exportfunctionzip<T,T2,T3,T4,T5>(v1: ObservableInput<T>,v2: ObservableInput<T2>,v3: ObservableInput<T3>,v4: ObservableInput<T4>,v5: ObservableInput<T5>): Observable<[T,T2,T3,T4,T5]>;
31-
exportfunctionzip<T,T2,T3,T4,T5,T6>(v1: ObservableInput<T>,v2: ObservableInput<T2>,v3: ObservableInput<T3>,v4: ObservableInput<T4>,v5: ObservableInput<T5>,v6: ObservableInput<T6>): Observable<[T,T2,T3,T4,T5,T6]>;
27+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>>(v1: O1,v2: O2): Observable<[ObservedValueOf<O1>,ObservedValueOf<O2>]>;
28+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,O3extendsObservableInput<any>>(v1: O1,v2: O2,v3: O3): Observable<[ObservedValueOf<O1>,ObservedValueOf<O2>,ObservedValueOf<O3>]>;
29+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,O3extendsObservableInput<any>,O4extendsObservableInput<any>>(v1: O1,v2: O2,v3: O3,v4: O4): Observable<[ObservedValueOf<O1>,ObservedValueOf<O2>,ObservedValueOf<O3>,ObservedValueOf<O4>]>;
30+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,O3extendsObservableInput<any>,O4extendsObservableInput<any>,O5extendsObservableInput<any>>(v1: O1,v2: O2,v3: O3,v4: O4,v5: O5): Observable<[ObservedValueOf<O1>,ObservedValueOf<O2>,ObservedValueOf<O3>,ObservedValueOf<O4>,ObservedValueOf<O5>]>;
31+
exportfunctionzip<O1extendsObservableInput<any>,O2extendsObservableInput<any>,O3extendsObservableInput<any>,O4extendsObservableInput<any>,O5extendsObservableInput<any>,O6extendsObservableInput<any>>(v1: O1,v2: O2,v3: O3,v4: O4,v5: O5,v6: O6): Observable<[ObservedValueOf<O1>,ObservedValueOf<O2>,ObservedValueOf<O3>,ObservedValueOf<O4>,ObservedValueOf<O5>,ObservedValueOf<O6>]>;
3232

33-
exportfunctionzip<T>(array: ObservableInput<T>[]): Observable<T[]>;
33+
exportfunctionzip<OextendsObservableInput<any>>(array: O[]): Observable<ObservedValueOf<O>[]>;
3434
exportfunctionzip<R>(array: ObservableInput<any>[]): Observable<R>;
3535
/** @deprecated resultSelector is no longer supported, pipe to map instead */
36-
exportfunctionzip<T,R>(array: ObservableInput<T>[],resultSelector: (...values: Array<T>)=>R): Observable<R>;
36+
exportfunctionzip<OextendsObservableInput<any>,R>(array: O[],resultSelector: (...values: ObservedValueOf<O>[])=>R): Observable<R>;
3737
/** @deprecated resultSelector is no longer supported, pipe to map instead */
38-
exportfunctionzip<R>(array: ObservableInput<any>[],resultSelector: (...values: Array<any>)=>R): Observable<R>;
38+
exportfunctionzip<R>(array: ObservableInput<any>[],resultSelector: (...values: any[])=>R): Observable<R>;
3939

40-
exportfunctionzip<T>(...observables: Array<ObservableInput<T>>): Observable<T[]>;
41-
exportfunctionzip<T,R>(...observables: Array<ObservableInput<T>|((...values: Array<T>)=>R)>): Observable<R>;
40+
exportfunctionzip<OextendsObservableInput<any>>(...observables: O[]): Observable<ObservedValueOf<O>[]>;
41+
exportfunctionzip<OextendsObservableInput<any>,R>(...observables: Array<O|((...values: ObservedValueOf<O>[])=>R)>): Observable<R>;
4242
exportfunctionzip<R>(...observables: Array<ObservableInput<any>|((...values: Array<any>)=>R)>): Observable<R>;
4343
/* tslint:enable:max-line-length */
4444

@@ -72,7 +72,9 @@ export function zip<R>(...observables: Array<ObservableInput<any> | ((...values:
7272
* @name zip
7373
* @owner Observable
7474
*/
75-
exportfunctionzip<T,R>(...observables: Array<ObservableInput<any>|((...values: Array<any>)=>R)>): Observable<R>{
75+
exportfunctionzip<OextendsObservableInput<any>,R>(
76+
...observables: Array<O|((...values: ObservedValueOf<O>[])=>R)>
77+
): Observable<ObservedValueOf<O>[]|R>{
7678
constresultSelector=<((...ys: Array<any>)=>R)>observables[observables.length-1];
7779
if(typeofresultSelector==='function'){
7880
observables.pop();

0 commit comments

Comments
 (0)