我正在使用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为用户提供了这种检查,但我找不到向您展示如何进行此类型检查的文档。
任何人都知道怎么做?
答案 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。它似乎仍在内部使用,因为我目前看不到将此函数直接导出到主索引中。