如何使用扫描运算符计算可观察到的空隙的发射值?

时间:2019-02-14 00:36:54

标签: angular typescript rxjs observable

我需要一个可观察到的void类型,它发出所发出的void值的数量。

String

上面给出了以下编译器错误:

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'. 运算符没有任何问题。

2 个答案:

答案 0 :(得分:2)

要解决您的问题,可以为传递给scan的函数的参数指定类型,如下所示:

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

scanreduce的键入需要引起注意。基本上,它们就是它们的样子,因为它们必须与旧版本的TypeScript一样。现在,TypeScript 2.8是RxJS 6的最低支持版本,应该可以改善键入。

答案 1 :(得分:-1)

您只需轻按

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>