Skip to content

Commit c03b355

Browse files
author
Sascha Dobschal
committed
Fix typescript issues
1 parent b6b5012 commit c03b355

File tree

5 files changed

+155
-136
lines changed

5 files changed

+155
-136
lines changed

Computed.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11

22
interface ComputedValue<T> {
33
value: T;
4-
subscribe(callback: (value: any) => void): void;
5-
unsubscribe(callback: (value: any) => void): void;
4+
subscribe(callback: (value: any) => void | Promise<void>): void;
5+
unsubscribe(callback: (value: any) => void | Promise<void>): void;
6+
isObservable: boolean;
67
}
78

89
export default function Computed<T>(fn: () => T, deep?: boolean): ComputedValue<T>;

Computed.test.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,43 @@ test("deep computed is affected by changes to the observables properties", () =>
123123
expect(mockedSubscriber).toHaveBeenCalledTimes(2);
124124
});
125125

126+
test("A computed function with a loop referencing an Observable should not cause an infinite loop", () => {
127+
const config = Observable({
128+
showItems: true,
129+
bla: 1
130+
});
131+
const items1 = Observable([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
132+
const items2 = Observable([1, 2, 3, 4]);
133+
const computed = Computed(() => {
134+
return items1.value.filter(i => {
135+
return config.value.showItems && items2.value.includes(i);
136+
}).map(i => {
137+
138+
return i * config.value.bla;
139+
});
140+
});
141+
const computedOfComputed = Computed(() => {
142+
return computed.value.map(i => i * 2).filter(v => v > 1 && config.value.showItems);
143+
});
144+
const mockedSubscriber1 = jest.fn();
145+
const mockedSubscriber2 = jest.fn();
146+
const mockedSubscriber3 = jest.fn();
147+
const mockedSubscriber4 = jest.fn();
148+
items1.subscribe(mockedSubscriber1);
149+
items2.subscribe(mockedSubscriber2);
150+
computed.subscribe(mockedSubscriber3);
151+
computedOfComputed.subscribe(mockedSubscriber4);
152+
expect(computed.value).toEqual([1, 2, 3, 4]);
153+
expect(computedOfComputed.value).toEqual([2, 4, 6, 8]);
154+
items2.value.push(5);
155+
expect(computed.value).toEqual([1, 2, 3, 4, 5]);
156+
expect(computedOfComputed.value).toEqual([2, 4, 6, 8, 10]);
157+
expect(mockedSubscriber1).toHaveBeenCalledTimes(1);
158+
expect(mockedSubscriber2).toHaveBeenCalledTimes(2);
159+
expect(mockedSubscriber3).toHaveBeenCalledTimes(2);
160+
expect(mockedSubscriber4).toHaveBeenCalledTimes(2);
161+
});
162+
126163
test("Have two computed arrays --> subscriber is called only once", () => {
127164
const entries = Observable([{value: 1}, {value: 2}, {value: 3}, {value: 4}, {value: 5}, {value: 6}, {value: 7}, {value: 8}, {value: 9}, {value: 10}], true);
128165
const categories = Observable([{value: 1}, {value: 2}, {value: 3}, {value: 4}, {value: 5}, {value: 6}, {value: 7}, {value: 8}, {value: 9}, {value: 10}], true);

Observable.d.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
interface ObservableVariable<T> {
2+
isObservable: boolean;
23
value: T;
34
set(value: T): void;
4-
subscribe(callback: (value: T) => void): void;
5-
unsubscribe(callback: (value: T) => void): void;
6-
map(callback: (value: any) => any): ObservableVariable<any>;
5+
subscribe(callback: (value: T) => void | Promise<void>): void;
6+
unsubscribe(callback: (value: T) => void | Promise<void>): void;
7+
map<U>(callback: (value: T) => U): ObservableVariable<U>;
78
}
89

910
export default function Observable<T>(initialValue: T, deep?: boolean): ObservableVariable<T>;

0 commit comments

Comments
 (0)