2017-10-18 15 views
1

私は誓います、RxJSは私の死になるでしょう。私はこれがRxJS、Typescript、またはAngularのいずれかの実装の実際のバグだと確信しています。これはthe RxJS docs page上で動作します(そのページ上のJavaScriptコンソールがRxJSサンドボックスとして機能します):角度/ RxJS/Typescriptは私のデータがオブジェクトであり、配列ではないと考えていますか?

new Rx.Observable(observer => observer.next([{ 
    id: 0, 
    name: 'John Doe' 
    }, { 
    id: 1, 
    name: 'Jane Smith' 
    }])) 
    .map(data => data.filter(item => item.name === 'John Doe')) 
    .subscribe(data => console.log(data), err => console.log(err)) 

しかし、まったく同じコードは、私の角のアプリケーションで私にエラーProperty 'filter' does not exist on type '{}'.を与えています。 data.filter部分を参照してください。その時点でdataが最も確かに配列なので、なぜそうは思わないのか分かりません。

アプリケーションが使用しているrxjsのバージョンを更新しましたが、何も変更されませんでした。どんな支援も大歓迎です。 RxJSは、これらの不一致がなくてもすでに十分に難しいです!

+0

これは、typescriptコンパイラによって投げられた型の問題です。角度コードを投稿できますか? – LLai

+0

興味深い 'data'は' any'型でなければなりません。それはRxによって引き起こされたようです。それが設計であるかどうかわからない。とにかくこれを修正するには、 'new Rx.Observable 'のように、オブザーバブルにラップされたデータのタイプを追加することができます。 –

+0

Hrmm ..任意の再現性?しかし、plnkrでもうまくいく。 http://plnkr.co/edit/gKe19SNASo4trdpkjKl5?p=preview – CozyAzure

答えて

2

.mapの中で.filterメソッドを使用しています。どちらの方法もデータを繰り返し処理します。つまり、.filterメソッド内でオブジェクトにアクセスしようとすると、dataにオブジェクトが含まれています。

new Rx.Observable(observer => observer.next([ 
    {id:0, name:'John Doe'}, 
    {id:1, name:'Jane Smith'} 
])).map(data => { 
    // data is an object since map iterates over your array 
    return data.filter(item => item.name === 'John Doe') 
).subscribe(data => console.log(data), err => console.log(err)) 

更新:

、あなたのデータをフィルタリングしたい場合は、map fucnctionを必要としません。

は、単純に次の操作を行います。

new Rx.Observable(observer => observer.next([ 
    {id:0, name:'John Doe'}, 
    {id:1, name:'Jane Smith'} 
])) 
.filter(item => item.name === 'John Doe') 
.subscribe(data => console.log(data), err => console.log(err)) 
+0

map関数で値を返すことを忘れないでください。あなたが 'return data.filter(item => item.name === 'John Doe');' –

+0

あなたが正しいと思っています!ヒントのおかげで。 – Orlandster

+0

私は分かりません。 RxJSの「.map」演算子は、観測値から放出された各値にマッピング関数を適用します。この場合、放出される値は配列です。配列内のオブジェクトではありません。 あなたのコードは私が提供したものと同じで、同じエラーが発生します。'.map'の中で' .filter'を使う以外に、配列をどのようにフィルタリングするのですか? –

1

これはtypescriptです側の問題ではなく、実際のコード側の動作です。このコードをJSのように実行すると、値はサブスクリプションを介してログに記録されます。ここで

主な問題がある

、あなたが new Observable() CTOR経由で観測可能作成するとき、あなたが提供する機能を購読する代わりに、関数のパラメータを購読する Observable<T>から推論の流れを入力経由して、観察の種類を推測することができません。その原因は、observableの型が Observable<{}>になり、配列のプロトタイプにアクセスできなくなります。

Observableをnew Observable<Array<{id: number, name: string}>>で作成すると、観測可能な演算子は正しく値の型を推測します。または、静的作成メソッドは、値の型推論を提供します。

Rx.Observable.of([{ 
    id: 0, 
    name: 'John Doe' 
}, { 
    id: 1, 
    name: 'Jane Smith' 
}]) 
.map(data => data.filter(item => item.name === 'John Doe')) 
.subscribe(data => console.log(data), err => console.log(err)) 
関連する問題