2017-10-18 31 views
1

我發誓,RxJS將會是我的死亡。我很確定這是一個實際的錯誤,無論是RxJS,Typescript還是Angular的實現。這適用於the RxJS docs page(該網頁上的JavaScript控制檯可以作爲一個RxJS沙箱):Angular/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

這是打字稿編譯器引發的類型問題。你可以發佈你的角碼嗎? – LLai

+0

嗯有趣的'數據'應該是'任何'類型。這似乎是由Rx引起的。不知道這是否是設計。無論如何要修復它,你可以添加包裝在observable中的數據類型,比如'new Rx.Observable '。 –

+0

Hrmm ..任何可再現的?雖然看起來很好。 http://plnkr.co/edit/gKe19SNASo4trdpkjKl5?p=preview – CozyAzure

回答

2

您在.map中使用.filter方法。兩種方法都會迭代您的數據,這意味着data包含一個對象,當您試圖在.filter方法中訪問它時。

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

不要忘記在地圖功能中返回一個值。我假設你想'返回data.filter(item => item.name ==='John Doe');' –

+0

你是對的!感謝提示。 – Orlandster

+0

我不明白。 RxJS'.map'運算符將映射函數應用於從observable發出的每個值。在這種情況下,發出的值是數組。不是數組內的對象。 您的代碼與我提供的代碼相同,並導致相同的錯誤。我如何過濾數組而不是在'.map'中使用'.filter'? –

1

這是打字稿枝節問題,而不是實際的代碼方面的行爲。如果您在JS上運行該代碼,則可以看到通過訂閱記錄了值。

這裏的主要問題是,當您通過new Observable() ctor創建可觀察項時,它不能通過您提供的訂閱函數推斷可觀察類型,而是從Observable<T>到subscribe函數參數的類型推斷流。原因是,你的observable的類型變成Observable<{}>,並且它無法訪問數組的原型。

通過new Observable<Array<{id: number, name: string}>>創建Observable使可觀察運算符正確地推斷值的類型。或者更好的是,靜態創建方法將提供值類型推斷 - 如

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)) 
相關問題