Поскольку на данный момент времени применение данного механизма не имеет смысла, то данную главу стоит изучить только в качестве исторической справки или при возникновении вопросов при работе с устаревшим кодом.
Начать рассмотрение механизмов пространства имен и модулей стоит с уточнения области их применения. Эти механизмы не предназначены для масштабных приложений, которые должны строиться при помощи модулей и загружаться с применением модульных загрузчиков. В настоящее время их можно использовать при написании небольших скриптов, внедряемых непосредственно в html страницу при помощи тега <script>, либо в приложениях, которые по каким-либо причинам не могут использовать модульную систему.
Пространство имен — это конструкция, которая объявляется при помощи ключевого слова namespace и представляется в коде обычным JavaScript объектом.
1
namespaceIdentifier{}
Механизм пространства имен является решением такой проблемы, как коллизии в глобальном пространстве имен, дошедшего до наших дней из тех времён, когда ещё в спецификации ECMAScript не было определено такое понятие, как модули. Простыми словами пространства имен — это совокупность обычной глобальной переменной и безымянного функционального выражения.
Объявленные внутри пространства имен конструкции срываются в безымянном функциональном выражении. Видимые снаружи конструкции записываются в объект, ссылка на который была сохранена в глобальную переменную, переданную в качестве аргумента. Что записывать в глобальный объект, а что нет, компилятору указывают при помощи ключевого слова export, о котором речь пойдет совсем скоро.
123456
// @info: До компиляцииnamespaceNamespaceIdentifier{classPrivateClassIdentifier{}exportclassPublicClassIdentifier{}}
1 2 3 4 5 6 7 8 910
// @info: После компиляцииvarNamespaceIdentifier;(function(NamespaceIdentifier){classPrivateClassIdentifier{}classPublicClassIdentifier{}NamespaceIdentifier.PublicClassIdentifier=PublicClassIdentifier;})(NamespaceIdentifier||(NamespaceIdentifier={}));
Также стоит добавить, что namespace является глобальным объявлением. Это дословно означает, что пространство имен, объявленное как глобальное, не нуждается в экспортировании и импортировании, а ссылка на него доступна в любой точке программы.
Модули в TypeScript определяются с помощью ключевых слов export/import и представляют механизм определения связей между модулями. Данный механизм является внутренним исключительно для TypeScript и не имеет никакого отношения к модулям es2015. В остальном они идентичны es2015 модулям, за исключением определения модуля по умолчанию (export default).
Кроме того, объявить с использованием ключевого слова export можно даже namespace. Это ограничит его глобальную область видимости и его использование в других файлах станет возможным только после явного импортирования.
Необходимо отметить, что экспортировать namespace стоит только тогда, когда он объявлен в теле другого namespace, но при этом до него нужно добраться из программы.