使用带有过滤器(布尔)的 RxJS 进行查询?
Posted
技术标签:
【中文标题】使用带有过滤器(布尔)的 RxJS 进行查询?【英文标题】:Using RxJS with filter(Boolean) for queries? 【发布时间】:2019-05-25 22:53:04 【问题描述】:我正在使用 sn-p 阅读一些代码:
search(query: string)
of(query).
pipe(
filter(Boolean),
debounceTime(300),
filter(Boolean)
与 filter(v=>!!v)
本质上是一样的吗?
【问题讨论】:
【参考方案1】:是的,它们是一样的。
console.log(typeof Boolean); // prints function
console.log(Boolean.prototype.constructor("truthy")); // prints true
console.log(Boolean === Boolean.prototype.constructor); // prints true
Boolean
全局引用指向从第一个参数返回布尔值的构造函数。
构造函数可以用来创建一个boolean包装对象,但它与原始的true值不同。
console.log(new Boolean("truthy")); // prints an object.
console.log(new Boolean("truthy").valueOf() === true); // prints true
console.log((new Boolean("truthy")) === true); // prints false
console.log(Boolean("truthy") === true); // prints true
参考:https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Boolean
【讨论】:
【参考方案2】:它们实现了相同的结果,因为您不会在订阅中获得未定义的值。
不同的是在使用 filter(Boolean) 时会丢失类型推断
const query = 'the query';
of(query).
pipe(
filter(Boolean)
).subscribe(val); // val here is of type 'Any'
of(query).
pipe(
filter(Boolean)
).subscribe((val: string)); // we can infer it back to string later
of(query).
pipe(
filter(v=> v!== undefined)
).subscribe(val); // val here is of type 'string'
【讨论】:
为什么我们会丢失过滤器(布尔)的类型推断?它与 TypeScript 和/或 RxJs 有关吗? TypeScript 和/或 RxJs 是否记录了它? @Marcus 它与 TypeScript 有关。以上不正确。该类型将被推断为boolean
,因为您将构造函数作为回调传递,而filter
类型从回调的第一个参数类型推断出类型。这是Boolean(val: boolean)
。您可以自己将类型定义为filter<string>(Boolean)
,它告诉函数可观察类型应该是什么。此外,当原始值真的是string
时,上面使用String
。这两种类型不是一回事。
曾经有类型问题。 RxJS 7 不再是这样了——他们修复了类型推断问题。以上是关于使用带有过滤器(布尔)的 RxJS 进行查询?的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 rxjs 针对 id 的字符串数组过滤 Observable