2017-01-31 90 views
1

我想關注此example學習switchMap對於rxjs。運行示例是here並以TypeScript編寫。我試圖在VS Code的TypeScript(Angular 2)中編寫類似的代碼,但是我得到一個編譯器錯誤。如何區分TypeScript中的泛型Observable類型?

 
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可觀測類型的任何想法?

+0

投票結束的原因是什麼? –

+0

爲什麼在'switchMap'中使用'Observable.of'?你提供的例子沒有。 –

+0

如果我不這樣做,我會在VS Code中發現一個編譯錯誤。請注意,該示例在TypeScript中,但是將其複製到VS代碼(在Angular 2項目中)不起作用。 –

回答

1

我想在VS代碼正確解決這個問題,你需要提供以下援助與泛型類型參數的transpiler:

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方法其輸入要麼是booleannumber及其種子值的類型是number

我們並沒有在這裏停止,因爲這會在遇到curr + acc表達式時將轉譯器混淆。這是因爲curr的類型是boolean | numberacc的類型是number

爲此,我在三元運算符中引入了一個附加條件:typeof curr === "number"這使得編譯器很高興並且代碼將會傳輸。這是因爲一個稱爲:type guards的功能。

另請注意,在switchMapObservable.of不是必需的。

相關問題