Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular/RxJS/Typescript认为我的数据是对象而不是数组?_Angular_Typescript_Rxjs - Fatal编程技术网

Angular/RxJS/Typescript认为我的数据是对象而不是数组?

Angular/RxJS/Typescript认为我的数据是对象而不是数组?,angular,typescript,rxjs,Angular,Typescript,Rxjs,我发誓,RxJS将是我的死亡。我很确定这是RxJS、Typescript或Angular的实现中的一个实际错误。这在(该页面上的javascript控制台用作RxJS沙盒)上起作用: 但是完全相同的代码给了我错误属性'filter'在类型{}上不存在。在我的应用程序中。引用数据。筛选部分数据在这一点上是一个数组,所以我真的不明白为什么它不这么认为 我已经更新了应用程序正在使用的rxjs版本,但这并没有改变任何事情。如蒙协助,将不胜感激。如果没有这些不一致,RxJS已经足够困难了 您正在使用.ma

我发誓,RxJS将是我的死亡。我很确定这是RxJS、Typescript或Angular的实现中的一个实际错误。这在(该页面上的javascript控制台用作RxJS沙盒)上起作用:

但是完全相同的代码给了我错误
属性'filter'在类型{}上不存在。
在我的应用程序中。引用
数据。筛选
部分<代码>数据
在这一点上是一个数组,所以我真的不明白为什么它不这么认为


我已经更新了应用程序正在使用的rxjs版本,但这并没有改变任何事情。如蒙协助,将不胜感激。如果没有这些不一致,RxJS已经足够困难了

您正在使用
.map
中的
.filter
方法。这两种方法都会对数据进行迭代,这意味着当您试图在
.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
功能

只需这样做:

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))

这是typescript端的问题,而不是实际的代码端行为。如果在JS上按原样运行此代码,则可以看到通过订阅记录的值

这里的主要问题是,当您通过
newobservable()
ctor创建observable时,它无法通过您提供的subscribe函数推断出observable的类型,而是从
observable
到subscribe函数参数的类型推断流。由于这些原因,您的observable的类型变为
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))

不要忘记在map函数中返回一个值。我假设您希望
返回data.filter(item=>item.name===='johndoe')我不明白。RxJS
.map
操作符将映射函数应用于从可观察对象发出的每个值。在这种情况下,发出的值是数组。而不是数组中的对象。您的代码与我提供的代码相同,并导致相同的错误。除了在
.map
中使用
.filter
之外,我应该如何过滤数组?我已经用一个应该适用于您的解决方案更新了答案。您更新的解决方案仍然会出现相同的错误。第二个
.filter
抛出错误:
属性“filter”在类型“{}”上不存在。
oops sry我的想法在哪里。现在它是正确的。删除typescript编译器抛出的第二个筛选器,这是一个打字问题。你能发布你的角度代码吗?嗯,有趣的
数据
应该是
any
类型。这似乎是由Rx引起的。不确定这是否是故意的。无论如何,要修复它,您可以添加封装在observable中的数据类型,比如
new Rx.observable
.Hrmm。。有复制品吗?不过在plnkr上看起来不错@谢谢你。键入可观察到的已修复问题。不太理想,但我已经解决这个问题三天了,我不再在乎了。
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))