Angular中RxJS的pipe新增tap操作符报TS2548错误如何解决
问题原因
该错误是RxJS的TypeScript类型重载限制导致的,和tap操作符本身的逻辑没有关系:
- RxJS 6.x及更早版本的
pipe方法,TypeScript类型定义仅预设了最多9个有效操作符参数的重载。当传入的操作符数量超过9个时,TypeScript无法正确推断Observable的返回值类型,会默认回退为Observable<{}>类型。 - 你最初可正常运行的代码中,第四个
tap后面多写了一个连续逗号,,,属于参数列表里的无效空项,不会被计入有效操作符,此时你的有效操作符数量刚好在9个以内,pairwise操作符返回的[oldValue, newValue]数组类型可以被正常识别,所以不会报错。 - 你修改代码时删除了多余的逗号,同时新增了一个
tap操作符,此时有效操作符数量超过9个,类型推断失效,subscribe接收的参数被判定为{}类型,自然不支持数组解构语法,就抛出了TS2548错误。
解决方案
你可以根据自己的需求任选一种方案解决:
- 合并多个功能类似的连续
tap操作符,把有效操作符数量降到9个以内,类型推断会自动恢复正常:
this.form.valueChanges .pipe( startWith(this.form.value), pairwise(), // 把多个重复的tap合并为一个 tap(() => { console.log('aa') console.log('aa') console.log('aa') console.log('aa') console.log('aa') console.log('aa') console.log('aa') }), takeUntil(this.destroy$) ) .subscribe(([oldValue, newValue]) => { this.updateOrder['id_order'] = newValue.id_order; });
- 手动给subscribe的参数标注类型,覆盖失效的自动推断:
// 请将下方的YourFormType替换为你实际的表单值类型 .subscribe(([oldValue, newValue]: [YourFormType, YourFormType]) => { this.updateOrder['id_order'] = newValue.id_order; })
- 升级RxJS到7.0及以上版本,该版本优化了pipe的类型定义,支持任意数量操作符的类型推断。
内容的提问来源于stack exchange,提问作者burasuk
相关产品推荐
相关产品推荐

