好的,我尝试了flatMap
,filter
和各种RxJS运算符的多种组合和排列,但我似乎无法解决我的问题。
我在TypeScript中有一个ITag
接口,其中包含一个属性selectable
。我有一个Observable
这些ITags
的数组,我想生成另一个Observable
数组ITags
,其中selectable
属性为true
这是一些假代码,它是大约三个小时的高潮。头疼:
protected getCategories(): Observable<ITag[]> {
return this.getModule()
.flatMap((module) => Observable.from(module.descendants))
.filter((descendant) => descendant.selectable);
}
此处,this.getModule()
返回Observable<ITag>
,module.descendants
为Array<ITag>
。编译器当前抱怨:
键入&#39; Observable&lt; ITAG&GT;&#39;不能分配给类型&#39; Observable&lt; ITag []&gt;&#39;。
有人可以帮忙吗?
答案 0 :(得分:0)
从方法的签名来判断你想要什么可能更符合这一点。
protected getCategories(): Observable<ITag[]> {
return this.getModule()
.reduce((acc, descendant) => { acc.push(descendant); return acc; }, [])
.map((descendants) => descendants.filter(d => d.selectable));
}
这样,您将获得一个包含ITag列表作为值的事件。您可以阅读有关reduce运算符here的更多信息。
你的代码很好,只是它产生了ITag的Observable,而不是ITag的数组。因此,您将分别为每个ITag获得一个活动。
如果这就是您想要的,您只需更改方法的返回类型即可。你得到那个错误是因为你要返回 Observable&lt; ITag&gt; 当函数定义表明它应该是 Observable&lt; ITag []&gt; 。
protected getCategories(): Observable<ITag> {
return this.getModule()
.flatMap((module) => Observable.from(module.descendants))
.filter((descendant) => descendant.selectable);
}