我试图了解反应式编程和可观察性,但当然不成功。我有以下代码:
this.searchSubscription = this.filtersSubject
.takeLast(2)
.reduce((acc, cur) => {
console.log(acc);
acc.push(cur);
return acc;
}, [])
.debounceTime(1000)
.subscribe(x => this.emitFilters());
我想使用takeLast(2)
管道传输到reduce
,因此我可以将其转换为两个值的数组,并且过滤器两者之间的某些值是不同的。我已经查看了reduce
的文档,甚至传递了种子,但VS代码告诉我Property 'push' does not exist on type 'Object'.
但console.log
显示acc
是一个数组。我对发生了什么以及如何解决这个问题感到困惑。当然,我可能完全错误地解决了这个问题,这使得可观察的内容难以理解。
答案 0 :(得分:6)
您的代码是正确的,但rxjs5中存在一个阻止其进行类型检查的错误。
查看reduce的源代码,我们看到以下签名
export function reduce<T>(this: Observable<T>, accumulator: (acc: T, value: T, index: number) => T, seed?: T): Observable<T>;
export function reduce<T>(this: Observable<T>, accumulator: (acc: T[], value: T, index: number) => T[], seed?: T[]): Observable<T[]>;
export function reduce<T, R>(this: Observable<T>, accumulator: (acc: R, value: T, index: number) => R, seed?: R): Observable<R>;
在TypeScript中编写重载时,有必要根据它们的类型(包括类型参数)从最大到最小的顺序排序它们。这是因为TypeScript选择了第一个匹配的重载。在这种情况下,重载集中的最后一个声明实际上需要指定为第一个。
由于这个问题,我创建了https://github.com/ReactiveX/rxjs/issues/2339。