如何修复(key:string)=>Observable类型参数无法分配给ObservableInput的类型报错
报错原因
mergeMap 操作符要求传入的回调函数必须返回符合 ObservableInput 类型的值(常见合法类型包括 Observable、Promise、数组等可迭代对象),触发报错的核心原因是回调函数的不同分支返回值类型不统一:
refresh()和saveChanges()两个方法中至少有一个返回的是普通PayloadType类型值,而非 Observable 类型- 如果你使用的是 RxJS 6+ 版本,代码中用到的
empty()已经废弃,返回的类型不符合当前 mergeMap 的泛型约束
修复步骤
- 统一所有分支返回值为 Observable 类型:如果
refresh()或saveChanges()返回的是普通值,使用of()方法将其包装为 Observable - 替换废弃的
empty()为 RxJS 官方提供的EMPTY常量 - 若仍有类型报错,可给 mergeMap 显式声明泛型约束匹配返回值类型
修复后参考代码
import { EMPTY } from 'rxjs'; import { filter, mergeMap } from 'rxjs/operators'; return action$.pipe( filter(a => a.type === 'ACTION'), mergeMap(action => { hideLoadingMask(); return askForMessageDialog({ title: 'test', type: 'question', text: getLocalized('test'), buttons: [ { key: 'cancel', caption: 'cancel'}, { key: 'notSave', caption: 'notSave' }, { key: 'save', caption: 'save' } ], primaryButtonKey: cancel }).pipe( // 可按需添加泛型约束:mergeMap<string, ObservableInput<any>> mergeMap((key) => { switch (key) { case notSave: { // 若refresh返回普通值则改为 return of(refresh()); return refresh(); } case save: { // 若saveChanges返回普通值则改为 return of(saveChanges()); return saveChanges(); } default: return EMPTY; } }) ); }) );
内容的提问来源于stack exchange,提问作者user2775418
相关产品推荐
相关产品推荐

