Как использовать оператор сканирования для подсчета излучаемых значений наблюдаемой пустоты? - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужна наблюдаемая типа void, которая испускает количество выданных значений void.

const subject = new Subject<void>();

subject.pipe(
    scan((acc, curr) => acc + 1, 0)
).subscribe(count => console.log(count));

subject.next(); // should output 1
subject.next(); // should output 2
subject.next(); // should output 3

Выше приведено следующее сообщение об ошибке компилятора:

   TS2345: Argument of type 'MonoTypeOperatorFunction<number>' is not 
      assignable to parameter of type 'OperatorFunction<void, number>'.
      Types of parameters 'source' and 'source' are incompatible.
      Type 'Observable<void>' is not assignable to type 'Observable<number>'.
      Type 'void' is not assignable to type 'number'.

Может быть, я простоустал, но я не могу исправить ошибку.Я не вижу ничего плохого в моем операторе scan().

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вы можете просто использовать кран

const { Subject } = rxjs;
const { tap } = rxjs.operators;

const subject = new Subject();

count = 0;

subject.pipe(
    tap(() => { count++; })
).subscribe(_ => console.log(count));

subject.next(); // should output 1
subject.next(); // should output 2
subject.next(); // should output 3
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>
0 голосов
/ 14 февраля 2019

Чтобы решить вашу проблему, вы можете указать типы для параметров функции, которую вы передаете в scan, например:

subject.pipe(
  scan((acc: number, curr: void) => acc + 1, 0)
).subscribe(count => console.log(count));

Для ввода scan и reduce нужно нескольковнимание.По сути, они такие, какие есть, потому что они должны были быть такими же для старых версий TypeScript.Теперь, когда TypeScript 2.8 является минимально поддерживаемой версией для RxJS 6, должна быть возможность улучшить типизацию.

...