Определить глобальное пространство имен/переменную в модуле TypeScript

В TypeScript Я могу определить пространство имен глобального/верхнего уровня и использовать его в другом файле следующим образом:

namespace foo.blah {
 export function baz() {
 console.log('hello');
 }
}

И в другом файле это работает:

foo.blah.baz();

Однако, если я затем импортирую что-то из другого модуля:

import Thing from 'boo';
namespace foo.blah {
 export function baz() {
 console.log('hello');
 }
}

Внезапно весь мой файл является модулем, пространство имен foo.blah является локальным, а не глобальным, а вызов foo.blah.baz() в другом файле завершается с ошибкой. export namespace ... просто заставляет пространство имен становиться частью экспорта модуля, а не глобальным.

Есть ли способ написать файл TypeScript, который импортирует из других модулей, но также определяет символы глобального/верхнего уровня?

В данный момент я делаю это:

import Thing from 'boo';
import * as $ from 'jquery';
namespace foo.blah {
 export function baz() {
 console.log('hello');
 }
}
$.extend(true, window, {foo});

Что работает, но компилятор TypeScript по-прежнему не может видеть, что foo.blah... существует как глобальный в других файлах.

(Файл является точкой входа для Webpack, и я пытаюсь импортировать вещи из других модулей в пакет Webpack и назначать их глобальным, чтобы их можно было использовать в тегах

1 ответ

Когда вы добавляете import, вы переключаетесь с внутренних модулей на внешние, поскольку спецификация говорит:

В внешних модулях отношения между файлами указаны в условия импорта и экспорта на уровне файлов. В TypeScript любой файл, содержащий импорт или экспорт верхнего уровня, считается внешним модуль.

http://www.typescriptlang.org/Handbook#modules-going-external

Философия внешних модулей заключается в том, чтобы избежать глобальных объектов, почему бы вам не создать новый модуль с foo.blah (и все, что вам нужно) и импортировать его как TypeScript ожидает его?

licensed under cc by-sa 3.0 with attribution.