![](/img/trans.png)
[英]How do I return in a tap on an observable in TypeScript/Angular?
[英]How do I distinguish between generic Observable types in TypeScript?
我试图在学习switchMap
for rxjs
时遵循这个例子。 运行示例在这里并用 TypeScript 编写。 我试图在 VS Code 的 TypeScript (Angular 2) 中编写类似的代码,但出现编译器错误。
Operator '+' cannot be applied to types 'Observable | Observable' and 'Observable | Observable'. (parameter) curr: Observable | Observable
我的代码如下。
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);
}
我可以按如下方式修改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
的 Observable 类型的任何想法?
我认为要在 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);
因此,这告诉transpiler使得输入到switchMap
是Observable<boolean>
或Observable<number>
和它的输出可以是一个boolean
或number
。
然后我们告诉scan
方法它的输入是一个boolean
或一个number
,它的种子值的类型是一个number
。
我们不会停在这里,因为这在遇到curr + acc
表达式时仍然会混淆转译器。 这是因为curr
的类型是boolean | number
boolean | number
和acc
的类型是number
。
为此,我在三元运算符中引入了一个附加条件: typeof curr === "number"
这使转译器满意并且代码将转译。 这是因为一个名为的功能: type guards 。
另请注意, switchMap
不需要Observable.of
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.