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

Angular RxJS将日志减少为数组,但将错误减少为对象,angular,rxjs,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())

我试着去思考反应式编程和可观察性,当然没有成功。我有以下代码:

this.searchSubscription = this.filtersSubject
  .takeLast(2)
  .reduce((acc, cur) => {
    console.log(acc);
    acc.push(cur);
    return acc;
  }, [])
  .debounceTime(1000)
  .subscribe(x => this.emitFilters());

我想使用管道连接到
reduce
takeLast(2)
,这样我就可以将它转换为两个值的数组,并且过滤器可以确定这两个值之间的值是不同的。我已经检查了
reduce
的文档,甚至传递了一个种子,但是VS-code告诉我类型“Object”上不存在
属性“push”。
但是
控制台.log
显示
acc
是一个数组。我对发生了什么以及如何解决它感到困惑。当然,我可能完全错误地解决了这个问题,这使得观测值很难理解。

您的代码是正确的,但是rxjs5中有一个bug阻止了它进行类型检查

查看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>;
导出函数reduce(此:可观察,累加器:(acc:T,value:T,index:number)=>T,种子?:T):可观察;
导出函数reduce(this:Observable,累加器:(acc:T[],value:T,index:number)=>T[],seed?:T[]):Observable;
导出函数reduce(此:可观察,累加器:(acc:R,值:T,索引:number)=>R,种子?:R):可观察;
在TypeScript中编写重载时,有必要对重载的类型(包括类型参数)从最大到最小进行排序。这是因为TypeScript选择第一个匹配的重载。在这种情况下,重载集中的最后一个声明实际上需要指定为第一个声明


我是因为这个问题才创建的。

谢谢您的反馈。我在反应式编程方面遇到了很多麻烦,像这样的东西让我觉得我搞错了。。。我可能仍然是。您知道我是否可以绕过这个问题,或者同时必须做一些其他的事情吗?另外,您可以通过使用。(而且,随着可观察对象的完成,
debounceTime
是冗余的,只是作为一个延迟,因为它只会看到一个值-数组。)如果不编辑源代码,那么几乎没有解决方法,但它们相当复杂。这是一个相当严重的错误,应该得到修复。我很惊讶之前没有报告过。也许是这样。@cartant这是一个很好的观点,但reduce的定义显然是错误的,因为它打算提供一个用例,其中累加器的类型不同于可观察元素产生的类型,但它没有做到这一点。@Aluan Yep。我同意你的看法。这是一个需要避免的RxJS bug,而不是OP。