繁体   English   中英

如何区分 TypeScript 中的通用 Observable 类型?

[英]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函数中的代码,但是我需要知道currObservable<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使得输入到switchMapObservable<boolean>Observable<number>和它的输出可以是一个booleannumber

然后我们告诉scan方法它的输入是一个boolean或一个number ,它的种子值的类型是一个number

我们不会停在这里,因为这在遇到curr + acc表达式时仍然会混淆转译器。 这是因为curr的类型是boolean | number boolean | numberacc的类型是number

为此,我在三元运算符中引入了一个附加条件: typeof curr === "number"这使转译器满意并且代码将转译。 这是因为一个名为的功能: type guards

另请注意, switchMap不需要Observable.of

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM