如何判断Observable是否为RxJS的NEVER类型?
原代码失效原因
空值合并运算符??仅对null、undefined两类空值生效,而RxJS的NEVER是一个合法的Observable实例,不属于空值范畴,因此原有判断逻辑不会触发。
解决方案
方案1:直接判断NEVER实例
RxJS内部NEVER是全局单例对象,可直接通过全等运算符判断:
export class MyComponent implements OnInit { @Input() isInitiallyOpen$?: Observable<boolean> = NEVER; isOpen$!: Observable<boolean>; constructor(private myService: MyService) {} ngOnInit() { // 直接比对实例是否为NEVER this.isOpen$ = this.isInitiallyOpen$ === NEVER ? this.myService.isOpen$ : this.isInitiallyOpen$; } }
注意:如果项目依赖中存在多份RxJS副本,可能导致
NEVER单例不唯一,全等判断失效,这种场景推荐使用方案2。
方案2:基于RxJS操作符实现fallback(更推荐)
无需显式判断NEVER类型,通过响应式操作符自动实现降级逻辑,兼容性更强:
import { raceWith } from 'rxjs'; export class MyComponent implements OnInit { @Input() isInitiallyOpen$?: Observable<boolean> = NEVER; isOpen$!: Observable<boolean>; constructor(private myService: MyService) {} ngOnInit() { // raceWith会优先选用第一个发出值的流,NEVER永远不会发出值,因此自动降级到备用流 this.isOpen$ = this.isInitiallyOpen$.pipe(raceWith(this.myService.isOpen$)); } }
额外注意事项
Angular的输入属性@Input()的外部传值会在构造函数执行完成后、ngOnInit生命周期触发前完成赋值,因此不要把输入属性的处理逻辑放在构造函数中,否则会拿不到外部传入的自定义值,只能拿到默认的NEVER。
内容的提问来源于stack exchange,提问作者Touhid Rahman
相关产品推荐
相关产品推荐

