使用带有过滤器(布尔)的 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 进行查询?的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 过滤布尔查询

ElasticSearch - 布尔查询过滤器问题

我可以使用 rxjs 针对 id 的字符串数组过滤 Observable

RESTful 过滤和查询中的布尔逻辑

Elasticsearch (DSL 布尔查询 过滤器 排序 高亮显示

使用 ComboBox 作为查询条件 - 布尔值