从 RxJS Observable 中过滤未定义的内容

2024-03-05

是否有特定的习惯用法或实用程序用于过滤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

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

在示例中:

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

the stringObsobservable 仍然具有类型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())

和类型stringObsObservable<string>。让我印象深刻的是 Typescript 能够推断出类型T正确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 RxJS Observable 中过滤未定义的内容 的相关文章

随机推荐