RxJS中已弃用的mapTo如何替换?改写代码遇类型错误求助
用map替代mapTo后出现TypeScript类型错误的解决方法
已知RxJS的mapTo(value)已被废弃,官方推荐用map(() => value)替代,但替换后原本正常运行的代码出现了类型错误。
代码示例
upload$ = new Subject<FileList>(); isUploading$: Observable<boolean>; ngOnInit() { const uploaded$ = this.upload$.pipe( switchMap((files) => { if (!files.length) { return of(null); } return this.importService.startUpload(files.length).pipe( switchMap(() => forkJoin(Array.from(files).map((file) => this.importService.uploadFile(file)))), ); }), share(), ); // 原可正常运行的代码 this.isUploading$ = merge(this.upload$.pipe(mapTo(true)), uploaded$.pipe(mapTo(false))); // 替换map后报错的代码 // Type 'Observable<unknown>' is not assignable to type 'Observable<boolean>'. // Argument of type 'Observable<boolean>' is not assignable to parameter of type 'OperatorFunction<unknown, unknown>'. this.isUploading$ = merge(this.upload$.pipe(map<boolean>(() => true), uploaded$.pipe(map(() => false)))); }
错误原因
核心问题是语法误用:你把merge的第二个Observable参数错误地放到了第一个Observable的pipe方法中。pipe的参数只能是RxJS操作符,不能直接传入另一个Observable,这导致TypeScript无法正确推断类型,进而抛出类型不匹配的错误。
正确的替换代码
只需将两个Observable分别作为merge的独立参数,每个Observable单独通过pipe使用map操作符即可:
this.isUploading$ = merge( this.upload$.pipe(map(() => true)), uploaded$.pipe(map(() => false)) );
补充说明
- 由于
() => true明确返回布尔值,TypeScript可以自动推断出Observable的类型为Observable<boolean>,无需手动指定map<boolean>泛型;如果需要更明确的类型标注,加上泛型也完全可行:this.isUploading$ = merge( this.upload$.pipe(map<boolean>(() => true)), uploaded$.pipe(map<boolean>(() => false)) );
内容的提问来源于stack exchange,提问作者ymoreau
相关产品推荐
相关产品推荐

