如何获取Observable的值 解决Subscription与number不可比较的TS报错
报错原因
这个TS类型报错的核心是你把 subscribe() 方法返回的 Subscription订阅对象 当成了数值类型使用,自然没法和数字做大小比较。具体有两个常见触发场景:
- 场景1:你判断
>0时用的是getAllDealsCount方法里定义的本地变量totalDeals,这个变量接收的是subscribe()的返回值,本身就是Subscription类型,和接口返回的合计值完全无关。 - 场景2:你判断的是类属性
this.totalDeals,但判断逻辑写在异步请求返回之前,或者你没有给类属性声明正确的数值类型,导致TS类型校验不通过。
修复方案
步骤1:先给类属性声明正确类型
首先在你的组件类里提前声明totalDeals的类型,给初始值避免未定义问题:
// 组件类内声明 totalDeals: number = 0;
步骤2:把大小判断逻辑放到异步回调里
接口请求是异步的,所有要用到totalDeals取值的逻辑都必须放到subscribe的回调函数里,不能写在getAllDealsCount()调用之后的同步代码里:
ngOnInit(): void { this.leaseId = this.transaction.leaseId; this.getAllDealsCount(); } getAllDealsCount() { zip(this.getCount('ForApproval'),this.getCount('Draft')) .subscribe(res => { // 异步返回后再赋值+做逻辑判断 this.totalDeals = res[0].data + res[1].data; // 你的大于0判断逻辑写在这里 if (this.totalDeals > 0) { // 执行业务逻辑 } }) } private getCount(item: any) { let status = item; return this.dealService.getCount( this.accountId, this.transaction.id, status ) }
额外优化:添加取消订阅逻辑避免内存泄漏
可以把订阅对象存下来,在组件销毁时取消订阅:
// 类内先引入Subscription类型,再声明订阅对象 import { Subscription } from 'rxjs'; private dealCountSub?: Subscription; getAllDealsCount() { this.dealCountSub = zip(this.getCount('ForApproval'),this.getCount('Draft')) .subscribe(res => { this.totalDeals = res[0].data + res[1].data; // 业务逻辑 }) } ngOnDestroy(): void { this.dealCountSub?.unsubscribe(); }
内容的提问来源于stack exchange,提问作者Agastya Kumar
相关产品推荐
相关产品推荐

