Angular 6中Observable无scan属性报错TS2339的解决求助
解决RxJS 6中
scan操作符的使用错误 这个错误是因为你用的Angular 6配套RxJS 6.x版本,而教程代码基于RxJS 5的写法——RxJS 6之后,所有操作符不再直接作为Observable的方法调用,必须通过pipe()方法包裹使用。另外你的scan逻辑还有点小问题,我一起帮你修正:
第一步:修正chat-dialog.component.ts中的scan调用
把原来直接链式调用.scan()改成用.pipe(scan(...)),同时修正数组合并逻辑(原来的acc + val会把数组转成字符串拼接,这不是你要的消息累加效果):
ngOnInit() { // 每次新消息加入后,追加到消息数组中 this.messages = this.chat.conversation.asObservable() .pipe( scan((acc, val) => [...acc, ...val]) // 合并新旧消息数组 ); }
第二步:优化chat.service.ts的消息推送逻辑(可选但更合理)
你的conversation是BehaviorSubject<Message[]>,当前每次next([msg])是把单个消息包装成数组发送,其实可以直接发送单个消息,组件里的scan处理会更直观:
修改chat.service.ts:
// 把BehaviorSubject的类型改成单个Message,初始值设为null conversation = new BehaviorSubject<Message>(null); // 修改update方法,直接发送单个消息实例 update(msg: Message) { this.conversation.next(msg); } // 同时对应修改组件里的scan逻辑: ngOnInit() { this.messages = this.chat.conversation.asObservable() .pipe( filter(msg => msg !== null), // 过滤初始的null值 scan((acc, val) => [...acc, val], []) // 初始值设为空数组,每次追加新消息 ); }
错误原因说明
RxJS 6做了重大改动:将操作符从Observable原型上移除,统一通过pipe()方法组合使用。这样既可以减小打包体积(按需引入操作符),也让代码结构更清晰。原来RxJS 5的observable.scan()写法在RxJS 6里就会报Property 'scan' does not exist on type 'Observable'这个错误。
内容的提问来源于stack exchange,提问作者uitwaa
相关产品推荐
相关产品推荐

