2017-10-18 47 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)) 
相关问题