检查对象是否是 Observable

Check if object is an Observable

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

有人知道怎么做吗?

自从写下这个答案后,RxJS 版本 6 已经发布,在那个版本中,isObservable 函数被添加到 public 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 [=47] 返回的值从外部 observable 获得一个 RxJS Observable =] 到 Rx.Observable.from.

看来检查对象中的key属性还是一种检查是否可观察的方法

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

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