2017-02-07 3 views
3

私はリアクティブプログラミングとオブザーバブルの周りに頭を上げようとしていますが、もちろん失敗しました。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)は、私は2つの値の配列にそれを回すことができ、かつフィルタが異なっていた二つの間の特定の値であるreduceにパイプを使用したい:私は、次のコードを持っています。私はreduceのドキュメントを見てきましたが、シードを渡しても、VSコードはProperty 'push' does not exist on type 'Object'.ですが、console.logaccが配列であることを示しています。私は何が起こっているのか、それをどうやって解決するのか、困惑しています。そして、もちろん、私はこの問題に完全に間違っているかもしれません。それは、観察可能なものを理解するのを十分に難しくしています。

答えて

5

コードは正しいですが、rxjs5にタイプチェックができないバグがあります。活字体に過負荷を書くことは、彼らの型引数を含め、種類に関して最大​​の少なくとも特異性にそれらを注文する必要がある場合には、我々は次のシグネチャ

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が最初に一致するオーバーロードを選択するためです。この場合、オーバーロードセットの最後の宣言は実際には最初の宣言として指定する必要があります。

この質問のため、https://github.com/ReactiveX/rxjs/issues/2339を作成しました。

+0

フィードバックに感謝します。私はリアクションのプログラミングの周りに頭を包んで十分な問題を抱えている、これは私がそれを間違っていると思うようになる...私はおそらくまだある。私はこれを回避することができますか、または平均して何か他のことをしなければならないかどうか知っていますか? – RhoVisions

+1

また、バグを避けることができ、['toArray'演算子](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-toArray)を使用してコードを単純化することができます)、代わりに。 (そして、観測可能なものが完成すると、 'debounceTime'は冗長であり、ただ一つの値(配列)しか見ないため、遅れとして機能します) – cartant

+0

ソースの編集に頼るのではなく、かなり複雑です。これは非常に深刻なバグです。私はそれが以前に報告されていないことに驚いています。おそらくそれがあります。 –

関連する問題