RxJS将日志减少为数组,但将错误视为对象

时间:2017-02-07 02:16:34

标签: angular rxjs

我试图了解反应式编程和可观察性,但当然不成功。我有以下代码:

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是一个数组。我对发生了什么以及如何解决这个问题感到困惑。当然,我可能完全错误地解决了这个问题,这使得可观察的内容难以理解。

1 个答案:

答案 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