我正在尝试switchMap
了解rxjs
playSubject = new Subject<boolean>();
pauseSubject = new Subject<boolean>();
interval$ = Observable.interval(1000).mapTo(-1);
pause$ = Observable.from(this.pauseSubject).mapTo(Observable.of(false));
resume$ = Observable.from(this.playSubject).mapTo(this.interval$);
timer$ = Observable
.merge(this.pause$, this.resume$)
.startWith(this.interval$)
.switchMap(v => Observable.of(v))
.scan((acc, curr) => {
return curr ? curr + acc : acc; //problem right here
});
ngAfterViewInit() {
this.timer$.subscribe(data => {
console.log(data);
});
}
play() { //bound to button click event
this.playSubject.next(true);
}
pause() { //bound to button click event
this.pauseSubject.next(false);
}
。正在运行的示例是example并使用TypeScript编写。我尝试在VS Code中使用TypeScript(Angular 2)编写类似的代码,但是我收到编译错误。
Operator '+' cannot be applied to types 'Observable | Observable' and 'Observable | Observable'. (parameter) curr: Observable | Observable
我的代码如下。
scan
我可以修改curr
函数中的代码,如下所示,但我需要知道Observable<boolean>
是Observable<number>
还是playSubject = new Subject<boolean>();
pauseSubject = new Subject<boolean>();
interval$ = Observable.interval(1000).mapTo(-1);
pause$ = Observable.from(this.pauseSubject).mapTo(Observable.of(false));
resume$ = Observable.from(this.playSubject).mapTo(this.interval$);
timer$ = Observable
.merge(this.pause$, this.resume$)
.startWith(this.interval$)
.switchMap(v => Observable.of(v))
.scan((acc, curr) => {
return curr; //how do i check for Observable<Type>?
});
。
scan
对于我做错了什么或如何检查BY NOT(ID MATCHES [123])
内的Observable类型有什么想法?
答案 0 :(得分:1)
我认为要在VS Code中正确修复此问题,您需要使用泛型类型参数为转换器提供以下帮助:
timer$ = Observable
.merge(this.pause$, this.resume$)
.startWith(this.interval$)
.switchMap<Observable<boolean> | Observable<number>, boolean | number>(v => v)
.scan<boolean | number, number>((acc, curr) => {
return curr && typeof curr === "number" ? curr + acc : acc;
}, 60);
因此,这告诉转换器switchMap
的输入是Observable<boolean>
或Observable<number>
,其输出是boolean
或number
。
然后我们告诉scan
方法,其输入是boolean
或number
,其种子值的类型是number
。
我们并没有停在这里,因为当遇到curr + acc
表达式时,这仍然会混淆转换器。这是因为curr
的类型为boolean | number
,而acc
的类型为number
。
为此,我在三元运算符中引入了一个附加条件:typeof curr === "number"
,这使得转换器开心,代码将会转换。这是因为一个名为type guards的功能。
另请注意,Observable.of
中不需要switchMap
。