Я создаю модуль npm в TypeScript https://www.npmjs.com/package/html2commonmark. Модуль можно использовать в nodejs (с помощью require
) и из браузера (путем загрузки node_modules/html2commonmark/dist/client/bundle.js
в вашем браузере).Объявить глобальную переменную с использованием внешнего модуля в TypeScript
Я недавно добавил файлы * .d.ts, чтобы получить ввод информации при использовании "moduleResolution": "node"
. Это отлично работает, при установке моего модуля он готов к использованию в машинописном тексте. Таким образом: следующий код машинописного текста компилируется без ошибок:
// After installing using npm install html2commonmark
// using "moduleResolution": "node"
import * as html2commonmark from 'html2commonmark';
let converter = new html2commonmark.JSDomConverter();
Прекрасно!
Теперь я хочу запустить свой модуль в браузере. Как уже упоминалось ранее, мне нужно добавить тег сценария в node_modules/html2commonmark/dist/client/bundle.js
на мою страницу index.html. После этого должна быть доступна глобальная переменная html2commonmark. Проблема в следующем: как я могу дать компилятору машинописного текста знать, что существует глобальная переменная? Следующий фрагмент кода TS не будет компилироваться:
let converter = new html2commonmark.BrowserConverter();
// error TS2304: Cannot find name 'html2commonmark'.
Даже если я добавить файл global.d.ts, я, кажется, не быть в состоянии как импортировать мой внешний модуль и объявить свою глобальную переменную:
// Something like this does not work :(
import * as b from 'html2commonmark';
declare var html2commonmark: typeof b;
Я понимаю, почему это так. Используя ключевое слово import, мой ts-файл преобразуется во внешний модуль и, следовательно, его нужно импортировать. Тем не менее, я чувствую, что мой сценарий является общим. А именно: модуль npm, содержащий как компонент npm, так и пакет для браузера, который предоставляет функциональность в качестве глобальной переменной.
Есть ли способ объявить глобальную переменную, используя определение внутри моего внешнего модуля? Я не чувствую, что переписываю api как пространство имен (ОпределенноТип-стиль), в то время как я просто написал весь свой исходный код в TS ...
Спасибо за ваш ответ! Для создания bundle.js я использую webpack. Конечно, я мог бы также заставить (машинописных) потребителей писать для браузера использовать webpack/browsify. Мне просто интересно, есть ли лучший способ. Я чувствую, что это должно быть возможно. с использованием окна '() .global = yourObject' не требуется, поскольку объект уже доступен в глобальной области действия (по крайней мере: при включении объекта bundje.js на вашей странице). Я просто ищу способ сделать его видимым для машинописного текста. –
nicojs
В этом случае ответ гораздо проще «нет». Вы можете выставить глобальные интерфейсы для именованных модулей в рукописных файлах d.ts с помощью 'declare module 'foo" {export = SomeGlobal; } ', но пути в другом направлении нет. –
Это очень плохо. Если вы обновите свой ответ с помощью короткой версии, я отметю его как правильный ответ. – nicojs