Angular/RxJS/Typescript认为我的数据是一个对象而不是数组?
我发誓,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已经够难了!
您在.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))
不要忘记在地图功能中返回一个值。我假设你想'返回data.filter(item => item.name ==='John Doe');' –
你是对的!感谢提示。 – Orlandster
我不明白。 RxJS'.map'运算符将映射函数应用于从observable发出的每个值。在这种情况下,发出的值是数组。不是数组内的对象。 您的代码与我提供的代码相同,并导致相同的错误。我如何过滤数组而不是在'.map'中使用'.filter'? –
这是打字稿枝节问题,而不是实际的代码方面的行为。如果您在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))
这是打字稿编译器引发的类型问题。你可以发布你的角码吗? – LLai
嗯有趣的'数据'应该是'任何'类型。这似乎是由Rx引起的。不知道这是否是设计。无论如何要修复它,你可以添加包装在observable中的数据类型,比如'new Rx.Observable'。 –
Hrmm ..任何可再现的?虽然看起来很好。 http://plnkr.co/edit/gKe19SNASo4trdpkjKl5?p=preview – CozyAzure