Пространства имен предоставляют вам удобный синтаксис для общепринятого шаблона, используемого в JavaScript:
(function(something) {
something.foo = 123;
})(something || (something = {}))В основном something || (something = {}) позволяет анонимной функции function(something) {} добавлять что-либо к существующему объекту (часть something ||) или стартовать новый объект, а затем добавлять что-либо к этому объекту (часть || (something = {})). Это означает, что у вас может быть два таких блока, разделенных по некоторой границе выполнения:
(function(something) {
something.foo = 123;
})(something || (something = {}))
console.log(something); // {foo:123}
(function(something) {
something.bar = 456;
})(something || (something = {}))
console.log(something); // {foo:123, bar:456}Это обычно используется в JavaScript, чтобы убедиться, что содержимое не просачивается в глобальное пространство имен. С файловыми модулями вам не нужно беспокоиться об этом, но шаблон все еще полезен для логической группировки набора функций. Поэтому TypeScript предоставляет ключевое слово namespace, чтобы сгруппировать их, например:
namespace Utility {
export function log(msg) {
console.log(msg);
}
export function error(msg) {
console.error(msg);
}
}
// использование
Utility.log('Call me');
Utility.error('maybe!');Ключевое слово namespace генерирует тот же JavaScript, который мы видели ранее:
(function (Utility) {
// Добавить в Utility
})(Utility || (Utility = {}));Следует отметить, что пространства имен могут быть вложенными, поэтому вы можете использовать такие вещи, как namespace Utility.Messaging, для вложения пространства имен Messaging в Utility.
Для большинства проектов мы рекомендуем использовать внешние модули, а namespace использовать для быстрой демонстрации и переноса старого кода JavaScript.