过滤和转换rxjs BehaviorSubject

时间:2019-06-29 18:48:39

标签: typescript rxjs

const subject = new BehaviorSubject<number | null>(null);
subject.next(1);
subject.next(2);

subject.pipe(
  filter(x => x !== null),
  take(1),                           // <--- VSCode shows an error here
  switchMap((x: number) => of(10)),
);

过滤后,流的类型仍为number | null(而不是number)。

因此VSCode显示take的错误:

  

类型'null'不能分配给类型'number'

过滤后是否可以更改流的类型?

1 个答案:

答案 0 :(得分:1)

如果您使用type guard,则filter的键入正确:

const isNumber = (n: number | null): n is number => n !== null

subject.pipe(
  filter(isNumber),
  take(1),
  switchMap((x: number) => of(10)),
);

您也可以在filter((x): x is number => x !== null)中使用类型谓词,但可读性较低。