首页 > 解决方案 > 从 RxJS Observable 过滤 undefined

问题描述

是否有特定的习惯用法或实用程序用于undefined从 RxJS 可观察对象中过滤?此代码具有我想要的行为:

obs.pipe(filter(x => x !== undefined))

一些替代方案是

obs.pipe(filter(x => x)) // for all falsy values

obs.pipe(filter(Boolean)) // for falsy variables using Boolean ctor

标签: typescriptrxjs

解决方案


严格来说,单独使用过滤器来删除未定义的值并不能满足您的所有需求。它过滤掉未定义的值,但不会更改类型以指示未定义不再是可能的值。

在示例中:

const obs = new Subject<string | undefined>;
const stringObs = obs.pipe(filter(x => x !== undefined))

stringObsobservable 仍然有type Observable<string | undefined>

要解决这个问题,您需要使用:

const stringObs = obs.pipe(filter(x => x !== undefined) as OperatorFunction<string | undefined, string>)

如果您使用严格的空检查,这只是一个真正的问题,但是如果您这样做(并且可以说您应该这样做),那么创建自定义运算符突然变得更有意义!就像是

function filterNullish<T>(): UnaryFunction<Observable<T | null | undefined>, Observable<T>> {
  return pipe(
    filter(x => x != null) as OperatorFunction<T | null |  undefined, T>
  );
}

做这项工作。

然后你可以使用:

const stringObs = obs.pipe(filterNullish())

的类型stringObs将是Observable<string>。Typescript 能够T正确推断出类型,这给我留下了深刻的印象。


推荐阅读