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

时间:2017-01-31 13:26:36

标签: angular typescript rxjs rxjs5 typescript2.0

我正在尝试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类型有什么想法?

1 个答案:

答案 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>,其输出是booleannumber

然后我们告诉scan方法,其输入是booleannumber,其种子值的类型是number

我们并没有停在这里,因为当遇到curr + acc表达式时,这仍然会混淆转换器。这是因为curr的类型为boolean | number,而acc的类型为number

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

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