RxJS 5.5后Observable新导入规范疑问:lettable/pipeable operators相关
关于RxJS 5.5+导入规则的疑惑解答
好问题!这确实是RxJS版本升级后容易混淆的点,我来给你理清楚:
1. 规则适用范围:是否涵盖rxjs/add/observable/of这类导入?
答案是是的,官方同样不推荐再使用rxjs/add/observable/of这类导入方式,不过原因和实例操作符(比如rxjs/add/operator/map)略有不同:
- 对于
rxjs/add/operator/*的实例操作符,导入后会污染Observable的原型链,不仅不利于tree shaking,还容易导致版本冲突; - 对于
rxjs/add/observable/*的静态方法,导入后会给Observable类挂载静态方法(比如Observable.of()),同样会让打包工具无法精准摇树——因为你实际上引入了整个Observable类并修改它,而不是只引入你需要的of函数本身。
官方的最佳实践是:无论是操作符还是Observable创建方法,都尽量采用按需导入独立函数的方式,而非修改类或原型。
2. 关于rxjs/observable/of的类型问题
你提到的rxjs/observable/of路径确实存在,但它属于RxJS的内部导出路径,并非官方推荐的公共API,所以它的类型定义没有得到良好的维护,出现兼容问题是正常的。
正确的导入方式应该是直接从rxjs根路径导入创建函数:
import { of } from 'rxjs'; // 直接调用即可,不需要通过Observable.of() const source$ = of(1, 2, 3);
这种方式不仅能获得完整的类型支持,还能让打包工具精准摇树,只打包你用到的of函数。
3. 额外补充:两类导入的对应替换关系
给你整理个简单的对应表,方便快速切换:
- 旧方式(不推荐):
import 'rxjs/add/observable/of';→ 调用Observable.of() - 新方式(推荐):
import { of } from 'rxjs';→ 直接调用of() - 旧方式(不推荐):
import 'rxjs/add/operator/map';→ 调用source$.map(...) - 新方式(推荐):
import { map } from 'rxjs/operators';→ 调用source$.pipe(map(...))
内容的提问来源于stack exchange,提问作者Raven
相关产品推荐
相关产品推荐

