Конфликт имен возникает, когда два или более компонентов кода используют одно и то же имя для переменной, функции или класса. Они распространены в больших проектах, где много людей работают над одной кодовой базой. Они могут затруднить определение того, какой компонент кода отвечает за ошибки.
Используя пространства имен, вы можете организовывать свой код и управлять им так, чтобы группы связанных компонентов находились под общим идентификатором. Это уменьшит риск конфликтов имен.
Создание пространства имен
Вы можете создавать пространства имен в TypeScript, используя пространство имен ключевое слово. Следуйте за ним с идентификатором, чтобы назвать пространство имен и блок, заключенный в фигурные скобки. Синтаксис похож на тот, который вы использовали бы для создать класс в JavaScript.
Например:
пространство имен Пример {}
Затем вы можете объявить элементы пространства имен — переменные, функции и классы — в блоке пространства имен:
пространство имен Пример {
экспортфункцияФу(): пустота{
консоль.бревно(«Это функция внутри пространства имен Example»);
}экспортсорт Бар {
свойство: нить;конструктор(свойство: нить) {
этот.свойство = свойство;
}
}
экспортконстанта баз = «Это переменная пространства имен»
}
В приведенном выше примере Фу, Бар, и баз являются членами Пример пространство имен. По умолчанию вы можете получить доступ только к членам пространства имен внутри этого же пространства имен. Использовать экспорт ключевое слово, чтобы сделать каждый член пространства имен доступным за его пределами.
Вы можете получить доступ ко всем общедоступным членам пространства имен, вызвав имя члена пространства имен, используя запись через точку:
Пример.foo(); // Это функция внутри пространства имен Example
константа бар = новый Пример. Бар("нить");
консоль.log (бар.свойство); // нить
консоль.log (пример.baz); // Это переменная пространства имен
Вложенные пространства имен
TypeScript позволяет вам вкладывать пространства имен в другие пространства имен, чтобы создать иерархическую структуру для вашего кода. Вложенные пространства имен могут еще больше снизить риск конфликтов имен за счет группировки связанных пространств имен под общим идентификатором.
Например:
пространство имен Пример {
экспортконстанта свойство_1 = "Фу";экспортпространство имен Бар {
экспортконстанта printFoo = функция () {
консоль.log (свойство_1);
};
}экспортпространство имен Баз {
экспортсорт Фу {
свойство: нить;
конструктор(свойство: нить) {
этот.свойство = свойство;
}
}
}
}
Приведенный выше блок кода представляет собой пример вложенного пространства имен. Пример пространство имен — это пространство имен верхнего уровня, содержащее Бар пространство имен и Баз пространство имен.
Вы можете получить доступ к свойствам во вложенном пространстве имен, используя запись через точку, которая соответствует созданной вами иерархической структуре.
Например:
консоль.log (Пример.property_1); // Фу
Пример. Бар.printFoo() // Фу
константа фу = новый Пример. Баз. Фу("пример")
Этот пример кода обращается к каждому члену пространства имен через родительское пространство имен. Прямой доступ к свойству, а не через его родительское пространство имен, вызовет ошибку:
Пример.printFoo()
// ошибка TS2339: свойство 'printFoo' не существует для типа 'typeof Example'
Хотя вложенные пространства имен могут помочь вам организовать ваш код, глубоко вложенные пространства имен могут привести к противоположному эффекту. Глубоко вложенные пространства имен затрудняют чтение и поддержку кода.
Псевдонимы пространств имен
Псевдоним пространства имен — это сокращенное имя, данное члену пространства имен, что упрощает обращение к нему.
Вы можете создать псевдоним пространства имен, используя Импортировать ключевое слово, за которым следует имя, которое вы хотите присвоить псевдониму. Затем назначьте Импортировать ключевое слово и псевдоним для члена пространства имен.
Например:
пространство имен Машина {
экспортпространство имен Тесла {
экспортсорт МодельX {
создавать(): Нить {
возвращаться«Модель X создана»
}
}
}экспортпространство имен Тойота {
экспортсорт Камри {}
}экспортпространство имен Форд {
экспортсорт Мустанг {}
}
}// Создание псевдонима
Импортировать тесла = автомобиль. Тесла
константа модельX = новый Тесла. МодельX()
модельX.создать() // Модель X создана
В этом примере создается псевдоним для Машина. Тесла пространство имен. Вы можете использовать этот псевдоним для доступа к свойствам Тесла пространства имен, как класс ModelX, проще.
Использование пространств имен в нескольких файлах
Чтобы использовать пространство имен в другом файле, его необходимо импортировать. Импорт пространств имен отличается от импорта переменных, функций, классов и т. д. В зависимости от вашего проекта модульная система, вы можете импортировать их с помощью требовать или Импортировать ключевое слово.
Однако вы можете импортировать пространства имен только с помощью директивы тройной косой черты, которая представляет собой однострочный комментарий, содержащий тег XML.
Например:
// main.ts
///
Пример.foo()
В этом примере используется директива тройной косой черты внутри main.ts файл. Директива ссылается на index.ts файл, который содержит Пример пространство имен. Без импорта пространство имен доступно только в том же файле, в котором оно определено.
После ссылки на index.ts файл, вы можете получить доступ к Пример пространство имен и его общедоступные члены. Например, вы можете позвонить в фу метод на Пример пространство имен.
Если вы используете несколько файлов, вам необходимо убедиться, что TypeScript скомпилирует и загрузит весь необходимый код. Вы можете сделать это, объединив выходные данные компилятора TypeScript с помощью outFile вариант. Затем все входные файлы будут скомпилированы в один выходной файл JavaScript. Общий синтаксис для запуска такого компилятора:
tsc --outFile
Заменять с именем вашего целевого файла JavaScript. Заменять с именем файла TypeScript, содержащего директиву тройной косой черты.
Например:
tsc --outFile index.js main.ts
Эта команда скомпилирует содержимое файла main.ts файл вместе со всеми файлами, на которые ссылается директива тройной косой черты, в index.js файл.
Кроме того, вы можете указать каждый файл отдельно:
tsc --outFile
Важно отметить, что директива тройной косой черты действительна только в том случае, если она объявлена в начале файла. Если вы попытаетесь использовать его в другом месте, TypeScript воспримет его как обычный однострочный комментарий без особого смысла.
Должны ли вы использовать пространства имен или модули?
Хотя пространства имен не устарели, часто рекомендуется организовывать код и управлять им с помощью модулей ES6. Модули легче поддерживать и управлять ими, и вы можете охватывать их несколькими файлами.
Кроме того, вы можете указать отношения между модулями с точки зрения импорта и экспорта на уровне файла. Пространства имен не могут определять свои зависимости.
В конечном счете, выбор между пространствами имен и модулями будет зависеть от конкретных потребностей и требований вашего проекта, поскольку оба предлагают ценный способ организации и управления кодом в TypeScript.