Skip to content

Commit 80ceea0

Browse files
tarasbenlesh
authored andcommittedJun 5, 2018
fix(from): Objects implementing Symbol.observable take precedence over other types
1 parent db2ac69 commit 80ceea0

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed
 

‎spec/observables/from-spec.ts

+16
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,21 @@ describe('from', () => {
5959
})
6060
});
6161

62+
const fakeArrayObservable = <T>(...values: T[]) => {
63+
let arr = ['bad array!'];
64+
arr[Symbol.observable] = () => {
65+
return {
66+
subscribe: (observer: Observer<T>) => {
67+
for (const value of values) {
68+
observer.next(value);
69+
}
70+
observer.complete();
71+
}
72+
};
73+
};
74+
return arr;
75+
};
76+
6277
const fakerator = <T>(...values: T[]) => ({
6378
[Symbol.iterator as symbol]: () => {
6479
const clone = [...values];
@@ -75,6 +90,7 @@ describe('from', () => {
7590
const sources: Array<{ name: string, value: any }> = [
7691
{ name: 'observable', value: of('x') },
7792
{ name: 'observable-like', value: fakervable('x') },
93+
{ name: 'observable-like-array', value: fakeArrayObservable('x') },
7894
{ name: 'array', value: ['x'] },
7995
{ name: 'promise', value: Promise.resolve('x') },
8096
{ name: 'iterator', value: fakerator('x') },

‎src/internal/observable/from.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function from<T>(input: ObservableInput<T>, scheduler?: SchedulerLike): O
1717
if (input instanceof Observable) {
1818
return input;
1919
}
20-
return new Observable(subscribeTo(input));
20+
return new Observable<T>(subscribeTo(input));
2121
}
2222

2323
if (input != null) {

‎src/internal/util/subscribeTo.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ export const subscribeTo = <T>(result: ObservableInput<T>) => {
2222
return result.subscribe(subscriber);
2323
}
2424
};
25+
} else if (result && typeof result[Symbol_observable] === 'function') {
26+
return subscribeToObservable(result as any);
2527
} else if (isArrayLike(result)) {
2628
return subscribeToArray(result);
2729
} else if (isPromise(result)) {
2830
return subscribeToPromise(result as Promise<any>);
2931
} else if (result && typeof result[Symbol_iterator] === 'function') {
3032
return subscribeToIterable(result as any);
31-
} else if (result && typeof result[Symbol_observable] === 'function') {
32-
return subscribeToObservable(result as any);
3333
} else {
3434
const value = isObject(result) ? 'an invalid object' : `'${result}'`;
3535
const msg = `You provided ${value} where a stream was expected.`

0 commit comments

Comments
 (0)
Please sign in to comment.