2017-01-31 3 views
1

Я стараюсь следовать этому example в обучении switchMap для rxjs. Пример работы: here и написан на языке TypeScript. Я попытался скомпоновать что-то подобное в TypeScript (Angular 2) в VS Code, но я получаю ошибку компилятора.Как отличить общие типы Observable в TypeScript?

 
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

Почему вы используете 'Observable.of' в' switchMap'? Пример, который вы указали, не имеет. –

+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, что вход в switchMap является Observable<boolean> или Observable<number>, а его выход - boolean или number.

Тогда мы говорим scan метод, его вход либо boolean или number и тип семени Value является number.

Мы не останавливаемся здесь, потому что это все равно путает транспилятор, когда он встретит выражение curr + acc. Это связано с тем, что curr - тип boolean | number и acc - тип number.

Для этого я ввел дополнительное условие в тройном операторе: typeof curr === "number", что делает транспилятор счастливым, и код будет перерисован. Это работает из-за функции, называемой: type guards.

Также обратите внимание, что Observable.of не требуется в switchMap.

Смежные вопросы