RxJS 5.5.6:如何将Observable<string[]>转换为Observable<string>?
解决RxJS 5.5.6中Observable<string[]>转Observable的问题
嗨,我来帮你搞定这个类型转换的问题~
首先明确说:mergeAll确实是可行的选择,但得用对姿势,不然TypeScript会因为类型不匹配报错。下面给你拆解原因和具体的解决办法:
为什么直接用mergeAll会报错?
你现在的源Observable是Observable<string[]>,它每次发出的是一个完整的字符串数组;而mergeAll默认期望上游Observable发出的是Observable类型的值(比如Observable<Observable<string>>),直接把数组丢给它,TypeScript自然会提示类型不兼容。
正确的用法:结合map+mergeAll
我们需要先把每个发出的字符串数组,转换成一个能逐个发出字符串的Observable,再用mergeAll把这些小Observable合并成一个Observable<string>:
import { Observable, of } from 'rxjs'; import { map, mergeAll } from 'rxjs/operators'; // 假设这是你的源Observable<string[]> const source$: Observable<string[]> = of(['hello', 'rxjs', 'world']); // 转换为Observable<string> const result$: Observable<string> = source$.pipe( // 把每个数组转成发出单个字符串的Observable map(strArray => of(...strArray)), // 合并所有小Observable的输出 mergeAll() );
更简洁的写法:用mergeMap
其实mergeMap就是map + mergeAll的组合操作符,用它可以一步到位,代码更清爽:
import { Observable, of } from 'rxjs'; import { mergeMap } from 'rxjs/operators'; const source$: Observable<string[]> = of(['hello', 'rxjs', 'world']); const result$: Observable<string> = source$.pipe( // mergeMap支持直接接收数组,内部会自动把数组转成Observable mergeMap(strArray => strArray) );
从根源解决:修改Observable的构造方式
既然你说可以修改Observable的构造方式,那最省心的办法就是一开始就创建Observable<string>,而不是Observable<string[]>。比如如果之前是用of包装数组:
// 原来的错误构造方式(得到Observable<string[]>) const source$ = of(['hello', 'rxjs', 'world']); // 修改为用from直接创建Observable<string> const source$ = from(['hello', 'rxjs', 'world']);
这样就完全不需要后续的转换操作了~
内容的提问来源于stack exchange,提问作者Doua Beri
相关产品推荐
相关产品推荐

