Skip to content

Commit

Permalink
Merge pull request #1640 from david-driscoll/improved-typings-cfz
Browse files Browse the repository at this point in the history
Improved typings for combineLatestStatic, forkJoin and zipStatic
  • Loading branch information
kwonoj committed May 24, 2016
2 parents be2c298 + 3a6c633 commit 0b36b96
Show file tree
Hide file tree
Showing 6 changed files with 245 additions and 9 deletions.
79 changes: 78 additions & 1 deletion spec/observables/combineLatest-spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {expect} from 'chai';
import * as Rx from '../../dist/cjs/Rx';
declare const {hot, cold, expectObservable, expectSubscriptions};
declare const {hot, cold, expectObservable, expectSubscriptions, type};

const Observable = Rx.Observable;
const queueScheduler = Rx.Scheduler.queue;
Expand Down Expand Up @@ -473,4 +473,81 @@ describe('Observable.combineLatest', () => {
expectSubscriptions(e1.subscriptions).toBe(e1subs);
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should support promises', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>;
let b: Promise<string>;
let c: Promise<boolean>;
let o1: Rx.Observable<[number, string, boolean]> = Observable.combineLatest(a, b, c);
let o2: Rx.Observable<boolean> = Observable.combineLatest(a, b, c, (aa, bb, cc) => !!aa && !!bb && cc);
/* tslint:enable:no-unused-variable */
});
});

it('should support observables', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>;
let b: Rx.Observable<string>;
let c: Rx.Observable<boolean>;
let o1: Rx.Observable<[number, string, boolean]> = Observable.combineLatest(a, b, c);
let o2: Rx.Observable<boolean> = Observable.combineLatest(a, b, c, (aa, bb, cc) => !!aa && !!bb && cc);
/* tslint:enable:no-unused-variable */
});
});

it('should support mixed observables and promises', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>;
let b: Rx.Observable<string>;
let c: Promise<boolean>;
let d: Rx.Observable<string[]>;
let o1: Rx.Observable<[number, string, boolean, string[]]> = Observable.combineLatest(a, b, c, d);
let o2: Rx.Observable<boolean> = Observable.combineLatest(a, b, c, d, (aa, bb, cc, dd) => !!aa && !!bb && cc && !!dd.length);
/* tslint:enable:no-unused-variable */
});
});

it('should support arrays of promises', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>[];
let o1: Rx.Observable<number[]> = Observable.combineLatest(a);
let o2: Rx.Observable<number[]> = Observable.combineLatest(...a);
let o3: Rx.Observable<number> = Observable.combineLatest(a, (...x) => x.length);
/* tslint:enable:no-unused-variable */
});
});

it('should support arrays of observables', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>[];
let o1: Rx.Observable<number[]> = Observable.combineLatest(a);
let o2: Rx.Observable<number[]> = Observable.combineLatest(...a);
let o3: Rx.Observable<number> = Observable.combineLatest(a, (...x) => x.length);
/* tslint:enable:no-unused-variable */
});
});

it('should return Array<T> when given a single promise', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>;
let o1: Rx.Observable<number[]> = Observable.combineLatest(a);
/* tslint:enable:no-unused-variable */
});
});

it('should return Array<T> when given a single observable', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>;
let o1: Rx.Observable<number[]> = Observable.combineLatest(a);
/* tslint:enable:no-unused-variable */
});
});
});
78 changes: 77 additions & 1 deletion spec/observables/forkJoin-spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {expect} from 'chai';
import * as Rx from '../../dist/cjs/Rx';
declare const {hot, expectObservable, expectSubscriptions};
declare const {hot, expectObservable, expectSubscriptions, type};
import {lowerCaseO} from '../helpers/test-helper';

const Observable = Rx.Observable;
Expand Down Expand Up @@ -292,4 +292,80 @@ describe('Observable.forkJoin', () => {
expectSubscriptions(e2.subscriptions).toBe(e2subs);
});

it('should support promises', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>;
let b: Promise<string>;
let c: Promise<boolean>;
let o1: Rx.Observable<[number, string, boolean]> = Observable.forkJoin(a, b, c);
let o2: Rx.Observable<boolean> = Observable.forkJoin(a, b, c, (aa, bb, cc) => !!aa && !!bb && cc);
/* tslint:enable:no-unused-variable */
});
});

it('should support observables', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>;
let b: Rx.Observable<string>;
let c: Rx.Observable<boolean>;
let o1: Rx.Observable<[number, string, boolean]> = Observable.forkJoin(a, b, c);
let o2: Rx.Observable<boolean> = Observable.forkJoin(a, b, c, (aa, bb, cc) => !!aa && !!bb && cc);
/* tslint:enable:no-unused-variable */
});
});

it('should support mixed observables and promises', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>;
let b: Rx.Observable<string>;
let c: Promise<boolean>;
let d: Rx.Observable<string[]>;
let o1: Rx.Observable<[number, string, boolean, string[]]> = Observable.forkJoin(a, b, c, d);
let o2: Rx.Observable<boolean> = Observable.forkJoin(a, b, c, d, (aa, bb, cc, dd) => !!aa && !!bb && cc && !!dd.length);
/* tslint:enable:no-unused-variable */
});
});

it('should support arrays of promises', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>[];
let o1: Rx.Observable<number[]> = Observable.forkJoin(a);
let o2: Rx.Observable<number[]> = Observable.forkJoin(...a);
let o3: Rx.Observable<number> = Observable.forkJoin(a, (...x) => x.length);
/* tslint:enable:no-unused-variable */
});
});

it('should support arrays of observables', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>[];
let o1: Rx.Observable<number[]> = Observable.forkJoin(a);
let o2: Rx.Observable<number[]> = Observable.forkJoin(...a);
let o3: Rx.Observable<number> = Observable.forkJoin(a, (...x) => x.length);
/* tslint:enable:no-unused-variable */
});
});

it('should return Array<T> when given a single promise', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>;
let o1: Rx.Observable<number[]> = Observable.forkJoin(a);
/* tslint:enable:no-unused-variable */
});
});

it('should return Array<T> when given a single observable', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>;
let o1: Rx.Observable<number[]> = Observable.forkJoin(a);
/* tslint:enable:no-unused-variable */
});
});
});
63 changes: 62 additions & 1 deletion spec/observables/zip-spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {expect} from 'chai';
import * as Rx from '../../dist/cjs/Rx';
declare const {hot, cold, expectObservable, expectSubscriptions};
declare const {hot, cold, expectObservable, expectSubscriptions, type};

declare const Symbol: any;

Expand Down Expand Up @@ -575,4 +575,65 @@ describe('Observable.zip', () => {
expect(vals).to.deep.equal(r[i++]);
}, null, done);
});

it('should support observables', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>;
let b: Rx.Observable<string>;
let c: Rx.Observable<boolean>;
let o1: Rx.Observable<[number, string, boolean]> = Observable.zip(a, b, c);
/* tslint:enable:no-unused-variable */
});
});

it('should support mixed observables and promises', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>;
let b: Rx.Observable<string>;
let c: Promise<boolean>;
let d: Rx.Observable<string[]>;
let o1: Rx.Observable<[number, string, boolean, string[]]> = Observable.zip(a, b, c, d);
/* tslint:enable:no-unused-variable */
});
});

it('should support arrays of promises', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>[];
let o1: Rx.Observable<number[]> = Observable.zip(a);
let o2: Rx.Observable<number[]> = Observable.zip(...a);
/* tslint:enable:no-unused-variable */
});
});

it('should support arrays of observables', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>[];
let o1: Rx.Observable<number[]> = Observable.zip(a);
let o2: Rx.Observable<number[]> = Observable.zip(...a);
/* tslint:enable:no-unused-variable */
});
});

it('should return Array<T> when given a single promise', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Promise<number>;
let o1: Rx.Observable<number[]> = Observable.zip(a);
/* tslint:enable:no-unused-variable */
});
});

it('should return Array<T> when given a single observable', () => {
type(() => {
/* tslint:disable:no-unused-variable */
let a: Rx.Observable<number>;
let o1: Rx.Observable<number[]> = Observable.zip(a);
/* tslint:enable:no-unused-variable */
});
});
});
18 changes: 18 additions & 0 deletions src/observable/ForkJoinObservable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,24 @@ export class ForkJoinObservable<T> extends Observable<T> {
super();
}

/* tslint:disable:max-line-length */
static create<T, T2>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>): Observable<[T, T2]>;
static create<T, T2, T3>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>): Observable<[T, T2, T3]>;
static create<T, T2, T3, T4>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>): Observable<[T, T2, T3, T4]>;
static create<T, T2, T3, T4, T5>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, v5: SubscribableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;
static create<T, T2, T3, T4, T5, T6>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, v5: SubscribableOrPromise<T5>, v6: SubscribableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;
static create<T, T2, R>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, project: (v1: T, v2: T2) => R): Observable<R>;
static create<T, T2, T3, R>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, project: (v1: T, v2: T2, v3: T3) => R): Observable<R>;
static create<T, T2, T3, T4, R>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): Observable<R>;
static create<T, T2, T3, T4, T5, R>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, v5: SubscribableOrPromise<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): Observable<R>;
static create<T, T2, T3, T4, T5, T6, R>(v1: SubscribableOrPromise<T>, v2: SubscribableOrPromise<T2>, v3: SubscribableOrPromise<T3>, v4: SubscribableOrPromise<T4>, v5: SubscribableOrPromise<T5>, v6: SubscribableOrPromise<T6>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): Observable<R>;
static create<T>(sources: SubscribableOrPromise<T>[]): Observable<T[]>;
static create<R>(sources: SubscribableOrPromise<any>[]): Observable<R>;
static create<T, R>(sources: SubscribableOrPromise<T>[], project: (...values: Array<T>) => R): Observable<R>;
static create<R>(sources: SubscribableOrPromise<any>[], project: (...values: Array<any>) => R): Observable<R>;
static create<T>(...sources: SubscribableOrPromise<T>[]): Observable<T[]>;
static create<R>(...sources: SubscribableOrPromise<any>[]): Observable<R>;
/* tslint:enable:max-line-length */
/**
* @param sources
* @return {any}
Expand Down
8 changes: 5 additions & 3 deletions src/observable/combineLatest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,23 @@ import { ArrayObservable } from './ArrayObservable';
import { CombineLatestOperator } from '../operator/combineLatest';

/* tslint:disable:max-line-length */
export function combineLatest<T>(v1: ObservableInput<T>, scheduler?: Scheduler): Observable<[T]>;
export function combineLatest<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>, scheduler?: Scheduler): Observable<[T, T2]>;
export function combineLatest<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, scheduler?: Scheduler): Observable<[T, T2, T3]>;
export function combineLatest<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, scheduler?: Scheduler): Observable<[T, T2, T3, T4]>;
export function combineLatest<T, T2, T3, T4, T5>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, scheduler?: Scheduler): Observable<[T, T2, T3, T4, T5]>;
export function combineLatest<T, T2, T3, T4, T5, T6>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, v6: ObservableInput<T6>, scheduler?: Scheduler): Observable<[T, T2, T3, T4, T5, T6]>;
export function combineLatest<T, R>(v1: ObservableInput<T>, project: (v1: T) => R, scheduler?: Scheduler): Observable<R>;
export function combineLatest<T, T2, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, project: (v1: T, v2: T2) => R, scheduler?: Scheduler): Observable<R>;
export function combineLatest<T, T2, T3, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => R, scheduler?: Scheduler): Observable<R>;
export function combineLatest<T, T2, T3, T4, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R, scheduler?: Scheduler): Observable<R>;
export function combineLatest<T, T2, T3, T4, T5, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R, scheduler?: Scheduler): Observable<R>;
export function combineLatest<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>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R, scheduler?: Scheduler): Observable<R>;
export function combineLatest<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R) | Scheduler>): Observable<R>;
export function combineLatest<T>(array: ObservableInput<T>[], scheduler?: Scheduler): Observable<T[]>;
export function combineLatest<R>(array: ObservableInput<any>[], scheduler?: Scheduler): Observable<R>;
export function combineLatest<T, R>(array: ObservableInput<T>[], project: (...values: Array<T>) => R, scheduler?: Scheduler): Observable<R>;
export function combineLatest<R>(array: ObservableInput<any>[], project: (...values: Array<any>) => R, scheduler?: Scheduler): Observable<R>;
export function combineLatest<T>(...observables: Array<ObservableInput<T> | Scheduler>): Observable<T[]>;
export function combineLatest<T, R>(...observables: Array<ObservableInput<T> | ((...values: Array<any>) => R) | Scheduler>): Observable<R>;
export function combineLatest<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R) | Scheduler>): Observable<R>;
/* tslint:enable:max-line-length */

/**
Expand Down
8 changes: 5 additions & 3 deletions src/operator/zip.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,21 +42,23 @@ export interface ZipSignature<T> {
/* tslint:enable:max-line-length */

/* tslint:disable:max-line-length */
export function zipStatic<T>(v1: ObservableInput<T>): Observable<[T]>;
export function zipStatic<T, T2>(v1: ObservableInput<T>, v2: ObservableInput<T2>): Observable<[T, T2]>;
export function zipStatic<T, T2, T3>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<[T, T2, T3]>;
export function zipStatic<T, T2, T3, T4>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<[T, T2, T3, T4]>;
export function zipStatic<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]>;
export function zipStatic<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]>;
export function zipStatic<T, R>(v1: ObservableInput<T>, project: (v1: T) => R): Observable<R>;
export function zipStatic<T, T2, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, project: (v1: T, v2: T2) => R): Observable<R>;
export function zipStatic<T, T2, T3, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => R): Observable<R>;
export function zipStatic<T, T2, T3, T4, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): Observable<R>;
export function zipStatic<T, T2, T3, T4, T5, R>(v1: ObservableInput<T>, v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): Observable<R>;
export function zipStatic<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>, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): Observable<R>;
export function zipStatic<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
export function zipStatic<T>(array: ObservableInput<T>[]): Observable<T[]>;
export function zipStatic<R>(array: ObservableInput<any>[]): Observable<R>;
export function zipStatic<T, R>(array: ObservableInput<T>[], project: (...values: Array<T>) => R): Observable<R>;
export function zipStatic<R>(array: ObservableInput<any>[], project: (...values: Array<any>) => R): Observable<R>;
export function zipStatic<T>(...observables: Array<ObservableInput<T>>): Observable<T[]>;
export function zipStatic<T, R>(...observables: Array<ObservableInput<T> | ((...values: Array<any>) => R)>): Observable<R>;
export function zipStatic<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
/* tslint:enable:max-line-length */

/**
Expand Down

0 comments on commit 0b36b96

Please sign in to comment.