检查对象是不是为 Observable

Posted

技术标签:

【中文标题】检查对象是不是为 Observable【英文标题】:Check if object is an Observable检查对象是否为 Observable 【发布时间】:2017-05-18 01:22:01 【问题描述】:

我正在使用 RxJS 5 并且有这个方法:

Queue.prototype.drain = function (obs, opts) ;

在该方法中,我想检查用户是否为第一个参数传入了Observable,或者他们是否省略了Observable,而只是传入了一个选项对象。

所以基本上我需要做这样的事情:

if(!Rx.Observable.isObservable(obs))  //this method is fictitious
    opts = obs || ;
    obs = Rx.Observable.interval(1000);

我假设 RxJS 为用户提供了这种检查,但我找不到向您展示如何进行这种类型检查的文档。

有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

自编写此答案以来,RxJS 版本 6 已经发布,并且在该版本中,isObservable 函数已添加到公共 API。可以这样导入:

import  isObservable  from "rxjs";

函数签名是:

export function isObservable<T>(obj: any): obj is Observable<T> 

由于它是使用类型保护定义的,因此编译器可以像这样帮助您:

const result: any = ...;

if (isObservable(result)) 

   result.pipe(...);   // compiler now knows it's an observable.


在内部,RxJS 测试 Observable using instanceof

if (result instanceof Observable) 
  ...

所以你可以使用:

if (!(obs instanceof Rx.Observable)) 
  opts = obs || ;
  obs = Rx.Observable.interval(1000);


instanceof 可用于确定一个对象是否是您正在使用的 RxJS 库中的 Observable

要判断对象是否为外来可观察对象,可以look for a Symbol.observable property。

如果该属性存在并且是一个函数,则可以通过将调用对象的Symbol.observable 属性返回的值传递给Rx.Observable.from 来从外部可观察对象中获取RxJS Observable

【讨论】:

if (isObservable(obj)) console.log("observable") 我听说instanceof 运算符在比较跨 iframe 运行的代码时可能会中断,如果构造函数 refs 不完全相同,这是有道理的。我假设isObservable 的实现可以处理这个问题。 !!obj &amp;&amp; 可能没必要,obj &amp;&amp; 就可以了 此页面上唯一的!! 在您的评论中。【参考方案2】:

似乎检查对象中的key属性仍然是一种检查它是否可观察的方法。

这里是an example used in the Nest.js Framework。

虽然,目前官方 rxjs 项目中确实有 a type guard-like util function defined。它似乎仍在内部使用,因为我目前没有看到此函数直接导出到主索引中。

【讨论】:

以上是关于检查对象是不是为 Observable的主要内容,如果未能解决你的问题,请参考以下文章

如何检查对象是不是为空

在 C# 中检查对象是不是为数字

如何检查 JavaScript 对象是不是为 DOM 对象?

检查对象是不是为 Observable

检查对象是不是为类类型

检查“任何”值是不是为对象