typescript - 从 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
解决方案
严格来说,单独使用过滤器来删除未定义的值并不能满足您的所有需求。它过滤掉未定义的值,但不会更改类型以指示未定义不再是可能的值。
在示例中:
const obs = new Subject<string | undefined>;
const stringObs = obs.pipe(filter(x => x !== undefined))
stringObs
observable 仍然有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
正确推断出类型,这给我留下了深刻的印象。
推荐阅读
- here-api - 如何防止 HERE 航点图出现较大偏差?
- javascript - 如何使用 docx 从角度将图像添加到 Word 文档?
- formula - 如何在画面中创建分区十分位数?(某些组内的十分位数)
- alexa - Alexa APL Pager OnPageChanged 事件仅通过触摸触发
- python - Python:在内部嵌套类中使用外部类的 self.variable
- php - composer.lock 如何保护你的项目的恶意依赖
- python - Python 模拟 TCP 套接字以进行单元测试的方法
- sql - 如何在 SQL 中找到第二和第三高薪水?
- angular - 在输入中打印 JSON 数据,角度
- jq - JQ如何将数组加入一行?