Проверьте, является ли объект наблюдаемым

Я использую 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 предоставляет пользователям такую проверку, но я не могу найти документацию, которая показывает, как выполнить эту проверку типов.

Кто-нибудь знает как?

Ответ 1

После написания этого ответа была выпущена версия 6 RxJS, и в этой версии в общедоступный 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 an observable.
}

Внутри RxJS тестирует Observable используя instanceof:

if (result instanceof Observable) {
  ...
}

Таким образом, вы можете использовать:

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

instanceof может использоваться для определения того, является ли объект Observable из библиотеки RxJS, которую вы используете.

Чтобы определить, является ли объект Symbol.observable наблюдаемой, вы можете найти свойство Symbol.observable.

Если свойство присутствует и является функцией, вы можете получить RxJS Observable от иностранного наблюдаемым, передавая значение, возвращаемого вызовом объекта Symbol.observable свойства Rx.Observable.from.

Ответ 2

Кажется, что проверка ключевого свойства в объекте все еще является подходом для проверки, наблюдаема ли она.

Вот пример, используемый в Nest.js Framework.

Хотя в настоящее время в официальном проекте rxjs определена функция утилит, похожая на тип guard. Кажется, он все еще используется внутри, потому что я не вижу прямого экспорта этой функции в основной индекс в настоящее время.