Skip to content

Commit a276fa4

Browse files
style(typings): added enhanced typings for bindCallback and combineLatest
1 parent 7a679b6 commit a276fa4

File tree

10 files changed

+147
-7
lines changed

10 files changed

+147
-7
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"build_closure": "java -jar ./node_modules/google-closure-compiler/compiler.jar ./dist/global/Rx.umd.js --language_in ECMASCRIPT5 --create_source_map ./dist/global/Rx.umd.min.js.map --js_output_file ./dist/global/Rx.umd.min.js",
2020
"build_global": "rm -rf dist/global && mkdir \"dist/global\" && node tools/make-umd-bundle.js && node tools/make-system-bundle.js && npm run build_closure",
2121
"build_perf": "npm run build_cjs && npm run build_global && webdriver-manager update && npm run perf",
22-
"build_test": "rm -rf dist/ && npm run lint && npm run build_cjs && jasmine",
22+
"build_test": "rm -rf dist/ && npm run lint && npm run build_cjs && tsc spec/typings/typing-tpecs.ts --outDir dist/tpec --target ES6 --diagnostics --pretty && jasmine",
2323
"build_cover": "rm -rf dist/ && npm run lint && npm run build_cjs && npm run cover",
2424
"build_docs": "./docgen.sh",
2525
"lint_perf": "eslint perf/",
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import {BoundCallbackObservable} from '../../../src/observable/bindCallback';
2+
import {Observable} from '../../../src/Observable';
3+
import {asap} from '../../../src/scheduler/asap';
4+
5+
type t = { a: string };
6+
type t2 = { b: string };
7+
type t3 = { c: string };
8+
type t4 = { d: string };
9+
type t5 = { e: string };
10+
type t6 = { f: string };
11+
12+
let observable: Observable<t>;
13+
let observable2: Observable<t2>;
14+
let observable3: Observable<t3>;
15+
let observable4: Observable<t4>;
16+
let observable5: Observable<t5>;
17+
let observable6: Observable<t6>;
18+
let numberObservable: Observable<number>;
19+
let booleanObservable: Observable<boolean>;
20+
21+
/* tslint:disable:no-unused-variable *//* tslint:disable:max-line-length */
22+
observable = BoundCallbackObservable.create((callback: (a: t) => void) => { /* */ })();
23+
observable2 = BoundCallbackObservable.create((a: string, callback: (a: t2) => void) => { /* */ })('a');
24+
observable3 = BoundCallbackObservable.create((a: string, b: number, callback: (r: t3) => void) => { /* */ })('a', 2);
25+
observable4 = BoundCallbackObservable.create((a: string, b: number, c: boolean, callback: (r: t4) => void) => { /* */ })('a', 2, false);
26+
observable5 = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, callback: (r: t5) => void) => { /* */ })('a', 2, false, 4);
27+
observable6 = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, e: string, callback: (r: t6) => void) => { /* */ })('a', 2, false, 4, 'e');
28+
numberObservable = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, e: string, f: boolean, callback: (r: number) => void) => { /* */ })('a', 2, false, 4, 'e', true);
29+
30+
observable = BoundCallbackObservable.create((callback: (a: t) => void) => { /* */ }, null, asap)();
31+
observable2 = BoundCallbackObservable.create((a: string, callback: (a: t2) => void) => { /* */ }, null, asap)('a');
32+
observable3 = BoundCallbackObservable.create((a: string, b: number, callback: (r: t3) => void) => { /* */ }, null, asap)('a', 2);
33+
observable4 = BoundCallbackObservable.create((a: string, b: number, c: boolean, callback: (r: t4) => void) => { /* */ }, null, asap)('a', 2, false);
34+
observable5 = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, callback: (r: t5) => void) => { /* */ }, null, asap)('a', 2, false, 4);
35+
observable6 = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, e: string, callback: (r: t6) => void) => { /* */ }, null, asap)('a', 2, false, 4, 'e');
36+
numberObservable = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, e: string, f: boolean, callback: (r: number) => void) => { /* */ }, null, asap)('a', 2, false, 4, 'e', true);
37+
38+
let observableArr: Observable<t[]>;
39+
observableArr = BoundCallbackObservable.create<t[]>((callback: (...args: t2[]) => void) => { /* */ })();
40+
41+
observable6 = BoundCallbackObservable.create((callback: (a: t, b: t2, c: t3) => void) => { /* */ }, (a: t, b: t2, c: t3) => <t6>{}, asap)();
42+
observable = BoundCallbackObservable.create((a: string, callback: (a: t2, b: t3, c: t4) => void) => { /* */ }, (a: t, b: t2, c: t3) => <t>{}, asap)('a');
43+
observable2 = BoundCallbackObservable.create((a: string, b: number, callback: (r: t3, b: t4, c: t5) => void) => { /* */ }, (a: t, b: t2, c: t3) => <t2>{}, asap)('a', 2);
44+
observable3 = BoundCallbackObservable.create((a: string, b: number, c: boolean, callback: (r: t4, b: t5, c: t6) => void) => { /* */ }, (a: t, b: t2, c: t3) => <t3>{}, asap)('a', 2, false);
45+
observable4 = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, callback: (r: t5, b: t5, c: t) => void) => { /* */ }, (a: t, b: t2, c: t3) => <t4>{}, asap)('a', 2, false, 4);
46+
observable5 = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, e: string, callback: (r: t6, b: t, c: t2) => void) => { /* */ }, (a: t, b: t2, c: t3) => <t5>{}, asap)('a', 2, false, 4, 'e');
47+
booleanObservable = BoundCallbackObservable.create((a: string, b: number, c: boolean, d: number, e: string, f: boolean, callback: (r: number) => void) => { /* */ }, (a: t, b: t2, c: t3) => false, asap)('a', 2, false, 4, 'e', true);
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import {CombineLatestDeclaration} from '../../../src/operator/combineLatest';
2+
import {Observable} from '../../../src/Observable';
3+
4+
interface Tester<T> extends Observable<T> {
5+
combineLatest: CombineLatestDeclaration<T>;
6+
}
7+
8+
type t = { a: string };
9+
type t2 = { b: string };
10+
type t3 = { c: string };
11+
type t4 = { d: string };
12+
type t5 = { e: string };
13+
type t6 = { f: string };
14+
15+
let observable: Tester<t>;
16+
let observable2: Observable<t2>;
17+
let observable3: Observable<t3>;
18+
let observable4: Observable<t4>;
19+
let observable5: Observable<t5>;
20+
let observable6: Observable<t6>;
21+
22+
/* tslint:disable:no-unused-variable */
23+
let result0: Observable<[t]> = observable.combineLatest();
24+
let result1: Observable<[t, t2]> = observable.combineLatest(observable2);
25+
let result2: Observable<[t, t2, t3]> = observable.combineLatest(observable2, observable3);
26+
let result3: Observable<[t, t2, t3, t4]> = observable.combineLatest(observable2, observable3, observable4);
27+
let result4: Observable<[t, t2, t3, t4, t5]> = observable.combineLatest(observable2, observable3, observable4, observable5);
28+
let result5: Observable<[t, t2, t3, t4, t5, t6]> = observable.combineLatest(observable2, observable3, observable4, observable5, observable6);
29+
30+
let project1: Observable<number> = observable.combineLatest(observable2,
31+
(a, b) => a.a.length + b.b.length);
32+
let project2: Observable<number> = observable.combineLatest(observable2, observable3,
33+
(a, b, c) => a.a.length + b.b.length + c.c.length);
34+
let project3: Observable<number> = observable.combineLatest(observable2, observable3, observable4,
35+
(a, b, c, d) => a.a.length + b.b.length + c.c.length + d.d.length);
36+
let project4: Observable<number> = observable.combineLatest(observable2, observable3, observable4, observable5,
37+
(a, b, c, d, e) => a.a.length + b.b.length + c.c.length + d.d.length + e.e.length);
38+
let project5: Observable<number> = observable.combineLatest(observable2, observable3, observable4, observable5, observable6,
39+
(a, b, c, d, e, f) => a.a.length + b.b.length + c.c.length + d.d.length + e.e.length + f.f.length);
40+
41+
let array: Observable<[t, t2, t3]> = observable.combineLatest<[t, t2, t3]>([observable2, observable3]);
42+
let arrayBool: Observable<boolean> = observable.combineLatest([observable2, observable3], (...args: any[]) => !!args.length);
43+
44+
let rest: Observable<[t, t2, t3]> = observable.combineLatest<[t, t2, t3]>(...[observable2, observable3]);
45+
let restBool: Observable<boolean> = observable.combineLatest(...[observable2, observable3, (...args: any[]) => !!args.length]);

spec/typings/typing-tpecs.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import './observable/bindCallback-tpec';
2+
import './operator/combineLatest-tpec';

src/CoreOperators.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {Subject} from './Subject';
55
import {GroupedObservable} from './operator/groupBy-support';
66
import {Notification} from './Notification';
77

8+
import {CombineLatestDeclaration} from './operator/combineLatest';
9+
810
export interface CoreOperators<T> {
911
buffer?: (closingNotifier: Observable<any>) => Observable<T[]>;
1012
bufferCount?: (bufferSize: number, startBufferEvery: number) => Observable<T[]>;
@@ -13,7 +15,7 @@ export interface CoreOperators<T> {
1315
bufferWhen?: (closingSelector: () => Observable<any>) => Observable<T[]>;
1416
catch?: (selector: (err: any, source: Observable<T>, caught: Observable<any>) => Observable<any>) => Observable<T>;
1517
combineAll?: <R>(project?: (...values: Array<any>) => R) => Observable<R>;
16-
combineLatest?: <R>(...observables: Array<Observable<any> | ((...values: Array<any>) => R)>) => Observable<R>;
18+
combineLatest: CombineLatestDeclaration<this>;
1719
concat?: <R>(...observables: (Observable<any> | Scheduler)[]) => Observable<R>;
1820
concatAll?: () => Observable<T>;
1921
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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import {ErrorObservable} from './observable/throw';
3535
import {AjaxCreationMethod} from './observable/dom/ajax';
3636
import {WebSocketSubject} from './observable/dom/webSocket';
3737

38+
import {CombineLatestDeclaration} from './operator/combineLatest';
39+
3840
/**
3941
* A representation of any set of values over any amount of time. This the most basic building block
4042
* of RxJS.
@@ -196,9 +198,7 @@ export class Observable<T> implements CoreOperators<T> {
196198
bufferWhen: (closingSelector: () => Observable<any>) => Observable<T[]>;
197199
catch: (selector: (err: any, source: Observable<T>, caught: Observable<any>) => Observable<any>) => Observable<T>;
198200
combineAll: <R>(project?: (...values: Array<any>) => R) => Observable<R>;
199-
combineLatest: <R>(...observables: Array<Observable<any> |
200-
Array<Observable<any>> |
201-
((...values: Array<any>) => R)>) => Observable<R>;
201+
combineLatest: CombineLatestDeclaration<this>;
202202
concat: <R>(...observables: (Observable<any> | Scheduler)[]) => Observable<R>;
203203
concatAll: () => Observable<any>;
204204
concatMap: <R>(project: ((x: T, ix: number) => Observable<any>), projectResult?: (x: T, y: any, ix: number, iy: number) => R) => Observable<R>;

src/add/operator/combineLatest.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
import {Observable} from '../../Observable';
66
import {combineLatest} from '../../operator/combineLatest';
77

8-
Observable.prototype.combineLatest = combineLatest;
8+
Observable.prototype.combineLatest = <any>combineLatest;
99

1010
export var _void: void;

src/observable/bindCallback.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,24 @@ import {AsyncSubject} from '../subject/AsyncSubject';
99
export class BoundCallbackObservable<T> extends Observable<T> {
1010
subject: AsyncSubject<T>;
1111

12+
/* tslint:disable:max-line-length */
13+
static create<TResult>(callbackFunc: (callback: (result: TResult) => any) => any, selector?: void, scheduler?: Scheduler): () => Observable<TResult>;
14+
static create<T, TResult>(callbackFunc: (v1: T, callback: (result: TResult) => any) => any, selector?: void, scheduler?: Scheduler): (v1: T) => Observable<TResult>;
15+
static create<T, T2, TResult>(callbackFunc: (v1: T, v2: T2, callback: (result: TResult) => any) => any, selector?: void, scheduler?: Scheduler): (v1: T, v2: T2) => Observable<TResult>;
16+
static create<T, T2, T3, TResult>(callbackFunc: (v1: T, v2: T2, v3: T3, callback: (result: TResult) => any) => any, selector?: void, scheduler?: Scheduler): (v1: T, v2: T2, v3: T3) => Observable<TResult>;
17+
static create<T, T2, T3, T4, TResult>(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, callback: (result: TResult) => any) => any, selector?: void, scheduler?: Scheduler): (v1: T, v2: T2, v3: T3, v4: T4) => Observable<TResult>;
18+
static create<T, T2, T3, T4, T5, TResult>(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, callback: (result: TResult) => any) => any, selector?: void, scheduler?: Scheduler): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => Observable<TResult>;
19+
static create<T, T2, T3, T4, T5, T6, TResult>(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, callback: (result: TResult) => any) => any, selector?: void, scheduler?: Scheduler): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => Observable<TResult>;
20+
static create<TResult>(callbackFunc: (callback: (...args: any[]) => any) => any, selector: (...args: any[]) => TResult, scheduler?: Scheduler): () => Observable<TResult>;
21+
static create<T, TResult>(callbackFunc: (v1: T, callback: (...args: any[]) => any) => any, selector: (...args: any[]) => TResult, scheduler?: Scheduler): (v1: T) => Observable<TResult>;
22+
static create<T, T2, TResult>(callbackFunc: (v1: T, v2: T2, callback: (...args: any[]) => any) => any, selector: (...args: any[]) => TResult, scheduler?: Scheduler): (v1: T, v2: T2) => Observable<TResult>;
23+
static create<T, T2, T3, TResult>(callbackFunc: (v1: T, v2: T2, v3: T3, callback: (...args: any[]) => any) => any, selector: (...args: any[]) => TResult, scheduler?: Scheduler): (v1: T, v2: T2, v3: T3) => Observable<TResult>;
24+
static create<T, T2, T3, T4, TResult>(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, callback: (...args: any[]) => any) => any, selector: (...args: any[]) => TResult, scheduler?: Scheduler): (v1: T, v2: T2, v3: T3, v4: T4) => Observable<TResult>;
25+
static create<T, T2, T3, T4, T5, TResult>(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, callback: (...args: any[]) => any) => any, selector: (...args: any[]) => TResult, scheduler?: Scheduler): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => Observable<TResult>;
26+
static create<T, T2, T3, T4, T5, T6, TResult>(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, callback: (...args: any[]) => any) => any, selector: (...args: any[]) => TResult, scheduler?: Scheduler): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => Observable<TResult>;
27+
static create<T>(callbackFunc: Function, selector?: void, scheduler?: Scheduler): (...args: any[]) => Observable<T>;
28+
static create<T>(callbackFunc: Function, selector?: (...args: any[]) => T, scheduler?: Scheduler): (...args: any[]) => Observable<T>;
29+
/* tslint:enable:max-line-length */
1230
static create<T>(callbackFunc: Function,
1331
selector: Function | void = undefined,
1432
scheduler?: Scheduler): (...args: any[]) => Observable<T> {

src/operator/combineLatest.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,28 @@ export function combineLatest<T, R>(...observables: Array<Observable<any> |
3131

3232
return new ArrayObservable(observables).lift<T, R>(new CombineLatestOperator<T, R>(project));
3333
}
34+
35+
/* These types would be come standard types used through-out the library */
36+
export type ObservableOrPromise<T> = Observable<T> | Promise<T>;
37+
export type ArrayOrIterator<T> = Iterator<T> | ArrayLike<T> | Array<T>;
38+
export type ObservableInput<T> = Observable<T> | Promise<T> | Iterator<T> | ArrayLike<T>;
39+
40+
/* tslint:disable:max-line-length */
41+
export interface CombineLatestDeclaration<T> {
42+
<T2>(v2: ObservableInput<T2>): Observable<[T, T2]>;
43+
<T2, T3>(v2: ObservableInput<T2>, v3: ObservableInput<T3>): Observable<[T, T2, T3]>;
44+
<T2, T3, T4>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>): Observable<[T, T2, T3, T4]>;
45+
<T2, T3, T4, T5>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, v5: ObservableInput<T5>): Observable<[T, T2, T3, T4, T5]>;
46+
<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]>;
47+
48+
<R>(project: (v1: T) => R): Observable<R>;
49+
<T2, R>(v2: ObservableInput<T2>, project: (v1: T, v2: T2) => R): Observable<R>;
50+
<T2, T3, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, project: (v1: T, v2: T2, v3: T3) => R): Observable<R>;
51+
<T2, T3, T4, R>(v2: ObservableInput<T2>, v3: ObservableInput<T3>, v4: ObservableInput<T4>, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): Observable<R>;
52+
<T2, T3, T4, T5, R>(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>;
53+
<T2, T3, T4, T5, T6, R>(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>;
54+
55+
<R>(...observables: Array<ObservableInput<any> | ((...values: Array<any>) => R)>): Observable<R>;
56+
<R>(array: ObservableInput<any>[]): Observable<R>;
57+
<R>(array: ObservableInput<any>[], project: (...values: Array<any>) => R): Observable<R>;
58+
}

tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
},
1616
"files": [
1717
"src/Rx.ts",
18-
"src/Rx.KitchenSink.ts"
18+
"src/Rx.KitchenSink.ts",
19+
"spec/typings/typing-tpecs.ts"
1920
]
2021
}

0 commit comments

Comments
 (0)