web-dev-qa-db-fra.com

Vérifiez si l'objet est un observable

J'utilise RxJS 5 et j'ai cette méthode:

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

dans la méthode, je voudrais vérifier si l'utilisateur a passé un Observable pour le premier argument ou s'il a omis le Observable et vient de passer un objet options.

Donc, fondamentalement, je dois faire quelque chose comme ça:

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

Je suppose que RxJS fournit aux utilisateurs ce type de vérification, mais je ne trouve pas la documentation qui vous montre comment effectuer cette vérification de type.

Quelqu'un sait comment?

16
user5047085

Depuis l'écriture de cette réponse, RxJS version 6 a été publiée et, dans cette version, une fonction isObservable a été ajoutée à l'API publique. Il peut être importé comme ceci:

import { isObservable } from "rxjs";

La signature de la fonction est:

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

Puisqu'il est défini avec un typeguard, le compilateur peut vous aider comme ceci:

const result: any = ...;

if (isObservable(result)) 
{
   result.pipe(...);   // compiler now knows it's an observable.
}

En interne, RxJS teste un Observableen utilisant instanceof :

if (result instanceof Observable) {
  ...
}

Vous pouvez donc utiliser:

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

instanceof peut être utilisé pour déterminer si un objet est un Observable de la bibliothèque RxJS que vous utilisez.

Pour déterminer si l'objet est un observable étranger, vous pouvez recherchez une propriété Symbol.observable .

Si la propriété est présente et est une fonction, vous pouvez obtenir un RxJS Observable à partir de l'observable étranger en transmettant la valeur renvoyée en appelant la propriété Symbol.observable De l'objet à Rx.Observable.from.

27
cartant

Il semble que la vérification de la propriété key dans l'objet soit toujours une approche pour vérifier si elle est observable.

Voici n exemple utilisé dans le cadre Nest.js .

Bien qu'il y ait exactement ne fonction util de type garde définie dans le projet rxjs officiel actuellement. Il semble toujours être utilisé en interne car je ne vois pas d'exportation directe de cette fonction dans l'index principal actuellement.

0
千木郷