Как использовать RxJS с определениями типов при использовании сборки UMD?

Например :

  1. npm я @ reactivex / rxjs
  2. Создайте файл index.ts с некоторой функцией, использующей RxJs
  3. Создайте файл index.html, который ссылается на сборку UMD RxJs, и файл index.js, созданный компилятором машинописного текста из файла index.ts.

здесь есть репро: https://github.com/valeriob/Repro_rxjs_typescript Просто запустите "tsc" и увидите ошибку компиляции.

Как мне получить определения типов при редактировании index.ts в этом сценарии?

Следуя этим рекомендациям, https://github.com/zspitz/TypeScript-Handbook/blob/release-2.0/pages/Modules.md#umd-modules мне удалось заставить его работать, добавив «экспорт как пространство имен rxjs;» в файл node_modules / rxjs / index.d.ts.

Если это должно быть решением, должны ли это делать авторы библиотеки?


person Valerio    schedule 06.11.2019    source источник
comment
не могли бы вы добавить фрагмент кода или явный вопрос, этот вопрос опасно близок к тому, чтобы быть закрытым из-за слишком широкого   -  person Chund    schedule 07.11.2019
comment
Спасибо добавлю репро   -  person Valerio    schedule 08.11.2019


Ответы (2)


Мне удалось найти обходной путь, поскольку rxjs не строит с определениями типов для своего пакета UMD.

Прежде всего, это работает только для TS ›= 3.5, потому что вам нужно включить allowUmdGlobalAccess , иначе вы получите эту ошибку:

TS2686: «rxjs» относится к глобалу UMD, но текущий файл является модулем. Вместо этого рассмотрите возможность добавления импорта.

Проверив конец файла node_modules/rxjs/bundles/rxjs.umd.js, вы можете обнаружить, что операторы, тестирование, ajax, webSocket и < strong> fetch похожи на подпространства имен, а все остальное находится непосредственно под глобальным rxjs:

...

var operators = _operators;
var testing = _testing;
var ajax$1 = _ajax;
var webSocket$1 = _webSocket;
var fetch$1 = _fetch;

exports.operators = operators;
exports.testing = testing;
exports.ajax = ajax$1;
exports.webSocket = webSocket$1;
exports.fetch = fetch$1;
exports.Observable = Observable;
exports.ConnectableObservable = ConnectableObservable;
exports.GroupedObservable = GroupedObservable;
exports.observable = observable;
...

Итак, все, что вам нужно сделать, это создать файл .d.ts следующим образом:

export * from 'rxjs'
export * as operators from 'rxjs/operators'
export * as testing from 'rxjs/testing'
export * as ajax from 'rxjs/ajax'
export * as webSocket from 'rxjs/webSocket'
export * as fetch from 'rxjs/fetch'

export as namespace rxjs

И теперь вы можете использовать глобальный rxjs в любом из ваших ts файлов:

const { interval } = rxjs
const { filter } = rxjs.operators

interval(500).pipe(
    filter(t => t % 2 === 0)
).subscribe(t => console.log(t))
person Victor Machado    schedule 06.09.2020

Я только что столкнулся с тем же сценарием, что и вы.

Прежде всего, вам нужно использовать npm для установки модуля rxjs где-нибудь на вашем компьютере. в этом модуле скопируйте папку dist\types в свой проект. (Я назвал это rxjs)

введите описание изображения здесь.

В этой папке добавьте следующие строки в конец index.d.ts:

export * as operators from './operators';
export * as ajax from './ajax';
export * as fetch from './fetch';
export * as webSocket from './webSocket';
export * as testing from './testing';

Наконец, создайте файл global.d.ts следующим образом:

import * as _rxjs from './rxjs';
declare global {
   const rxjs: typeof _rxjs;
}

И теперь вы можете использовать глобальный rxjs!

person Tiến Thành Nguyễn    schedule 01.06.2021