检查对象是否是Observable

时间:2017-01-03 20:53:49

标签: javascript rxjs rxjs5

我正在使用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为用户提供了这种检查,但我找不到向您展示如何进行此类型检查的文档。

任何人都知道怎么做?

2 个答案:

答案 0 :(得分:23)

自写这个答案以来,RxJS第6版已经发布,在该版本中,公共API中添加了isObservable函数。它可以像这样导入:

import { isObservable } from "rxjs";

功能签名是:

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

由于它是使用typeguard定义的,编译器可以像这样帮助你:

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

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

答案 1 :(得分:1)

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

这是an example used in the Nest.js Framework

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