angular - Hur man använder scan-operatören för att räkna emitterade värden från en void-observable?
Jag behöver ett observerbart av typen void som avger antalet emitterade void-värden.
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
Ovanstående ger följande kompilatorfel:
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'.
Kanske är jag bara trött, men jag verkar inte kunna åtgärda felet. Jag ser inget fel med min scan()-operator.
Svar #1
För att lösa ditt problem kan du specificera typer för parameternas funktion som du skickar till scan, på det här sättet:
subject.pipe(
scan((acc: number, curr: void) => acc + 1, 0)
).subscribe(count => console.log(count));
Typningarna för scan och reduce behöver lite uppmärksamhet. I princip är de som de är eftersom de behövde vara så för äldre versioner av TypeScript. Nu när TypeScript 2.8 är den minsta stödda versionen för RxJS 6, borde det vara möjligt att förbättra typningarna.
Svar #2
Du kan bara använda en kran
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>