Skip to content

Commit 3c62bd6

Browse files
committed
fix: eliminate use of instanceof
eliminate use of instanceof to support passing observables between javascript contexts Closes ReactiveX#2628
1 parent 279d775 commit 3c62bd6

File tree

8 files changed

+18
-8
lines changed

8 files changed

+18
-8
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@
166166
"gzip-size": "^3.0.0",
167167
"http-server": "^0.9.0",
168168
"husky": "^0.13.3",
169-
"lint-staged": "3.2.5",
169+
"lint-staged": "3.5.1",
170170
"lodash": "^4.15.0",
171171
"madge": "^1.4.3",
172172
"markdown-doctest": "^0.9.1",

src/observable/FromObservable.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { Observable, ObservableInput } from '../Observable';
1212
import { Subscriber } from '../Subscriber';
1313
import { ObserveOnSubscriber } from '../operator/observeOn';
1414
import { observable as Symbol_observable } from '../symbol/observable';
15+
import { isObservable } from '../util/isObservable';
1516

1617
/**
1718
* We need this JSDoc comment for affecting ESDoc.
@@ -85,7 +86,7 @@ export class FromObservable<T> extends Observable<T> {
8586
static create<T>(ish: ObservableInput<T>, scheduler?: IScheduler): Observable<T> {
8687
if (ish != null) {
8788
if (typeof ish[Symbol_observable] === 'function') {
88-
if (ish instanceof Observable && !scheduler) {
89+
if (isObservable(ish) && !scheduler) {
8990
return ish;
9091
}
9192
return new FromObservable<T>(ish, scheduler);

src/observable/dom/WebSocketSubject.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Observer, NextObserver } from '../../Observer';
99
import { tryCatch } from '../../util/tryCatch';
1010
import { errorObject } from '../../util/errorObject';
1111
import { assign } from '../../util/assign';
12+
import { isObservable } from '../../util/isObservable';
1213

1314
export interface WebSocketSubjectConfig {
1415
url: string;
@@ -86,7 +87,7 @@ export class WebSocketSubject<T> extends AnonymousSubject<T> {
8687
}
8788

8889
constructor(urlConfigOrSource: string | WebSocketSubjectConfig | Observable<T>, destination?: Observer<T>) {
89-
if (urlConfigOrSource instanceof Observable) {
90+
if (isObservable(urlConfigOrSource)) {
9091
super(destination, <Observable<T>> urlConfigOrSource);
9192
} else {
9293
super();

src/operator/concat.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { IScheduler } from '../Scheduler';
33
import { isScheduler } from '../util/isScheduler';
44
import { ArrayObservable } from '../observable/ArrayObservable';
55
import { MergeAllOperator } from './mergeAll';
6+
import { isObservable } from '../util/isObservable';
67

78
/* tslint:disable:max-line-length */
89
export function concat<T>(this: Observable<T>, scheduler?: IScheduler): Observable<T>;
@@ -178,7 +179,7 @@ export function concatStatic<T, R>(...observables: Array<ObservableInput<any> |
178179
scheduler = args.pop();
179180
}
180181

181-
if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {
182+
if (scheduler === null && observables.length === 1 && isObservable(observables[0])) {
182183
return <Observable<R>>observables[0];
183184
}
184185

src/operator/merge.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { IScheduler } from '../Scheduler';
33
import { ArrayObservable } from '../observable/ArrayObservable';
44
import { MergeAllOperator } from './mergeAll';
55
import { isScheduler } from '../util/isScheduler';
6+
import { isObservable } from '../util/isObservable';
67

78
/* tslint:disable:max-line-length */
89
export function merge<T>(this: Observable<T>, scheduler?: IScheduler): Observable<T>;
@@ -160,7 +161,7 @@ export function mergeStatic<T, R>(...observables: Array<ObservableInput<any> | I
160161
concurrent = <number>observables.pop();
161162
}
162163

163-
if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {
164+
if (scheduler === null && observables.length === 1 && isObservable(observables[0])) {
164165
return <Observable<R>>observables[0];
165166
}
166167

src/testing/TestScheduler.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { TestMessage } from './TestMessage';
66
import { SubscriptionLog } from './SubscriptionLog';
77
import { Subscription } from '../Subscription';
88
import { VirtualTimeScheduler, VirtualAction } from '../scheduler/VirtualTimeScheduler';
9+
import { isObservable } from '../util/isObservable';
910

1011
const defaultMaxFrame: number = 750;
1112

@@ -83,7 +84,7 @@ export class TestScheduler extends VirtualTimeScheduler {
8384
subscription = observable.subscribe(x => {
8485
let value = x;
8586
// Support Observable-of-Observables
86-
if (x instanceof Observable) {
87+
if (isObservable(x)) {
8788
value = this.materializeInnerObservable(value, this.frame);
8889
}
8990
actual.push({ frame: this.frame, notification: Notification.createNext(value) });

src/util/isObservable.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { Observable } from '../Observable';
2+
export function isObservable<T>(value: any | Observable<T>): value is Observable<T> {
3+
return value && typeof (<any>value).subscribe === 'function' && typeof (<any>value)._isScalar === 'boolean';
4+
}

src/util/subscribeToResult.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ import { isArrayLike } from './isArrayLike';
33
import { isPromise } from './isPromise';
44
import { isObject } from './isObject';
55
import { Subscriber } from '../Subscriber';
6-
import { Observable, ObservableInput } from '../Observable';
6+
import { ObservableInput } from '../Observable';
77
import { iterator as Symbol_iterator } from '../symbol/iterator';
88
import { Subscription } from '../Subscription';
99
import { InnerSubscriber } from '../InnerSubscriber';
1010
import { OuterSubscriber } from '../OuterSubscriber';
1111
import { observable as Symbol_observable } from '../symbol/observable';
12+
import { isObservable } from './isObservable';
1213

1314
export function subscribeToResult<T, R>(outerSubscriber: OuterSubscriber<T, R>,
1415
result: any,
@@ -24,7 +25,7 @@ export function subscribeToResult<T>(outerSubscriber: OuterSubscriber<any, any>,
2425
return null;
2526
}
2627

27-
if (result instanceof Observable) {
28+
if (isObservable(result)) {
2829
if (result._isScalar) {
2930
destination.next((<any>result).value);
3031
destination.complete();

0 commit comments

Comments
 (0)