web-dev-qa-db-ja.com

オブジェクトが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がこの種のチェックをユーザーに提供すると仮定しますが、このタイプチェックの実行方法を示すドキュメントが見つかりません。

誰もが知っていますか?

16
user5047085

この回答を書いてから、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をテストします instanceofを使用

if (result instanceof Observable) {
  ...
}

だからあなたは使用することができます:

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

instanceofを使用して、オブジェクトが使用しているRxJSライブラリのObservableであるかどうかを判断できます。

オブジェクトが外部のオブザーバブルかどうかを判断するには、 Symbol.observableプロパティを探します を使用します。

プロパティが存在し、関数である場合、オブジェクトのSymbol.observableプロパティを呼び出して返された値をRx.Observable.fromに渡すことにより、外部オブザーバブルからRxJS Observableを取得できます。

27
cartant

オブジェクトのキープロパティを確認することは、それが観察可能かどうかを確認するためのアプローチであるようです。

Nest.jsフレームワークで使用される例 です。

ただし、現在、公式のrxjsプロジェクトには 定義されたタイプガードのようなutil関数 があります。現在この関数をメインインデックスに直接エクスポートしていないため、内部で使用されているようです。

0
千木郷