======NAMESPACE======
Данный раздел документации описывает различные пути организации вашего кода в TypeScript с помощью пространств имён (бывш. "внутренние модули"). Согласно замечанию о терминологии, "внутренние модули" теперь называются "пространства имён". В дополнение к этому, везде, где раньше для декларирования внутреннего модуля использовалось ключевое слово ''module'', теперь вместо него должно быть использовано ключевое слово ''namespace''. Это позволяет упростить жизнь новым пользователям, не перегружая их терминами с похожими названиями.
====== Первые шаги # ======
Давайте начнём с программы, которую мы будем использовать в этом разделе документации в качестве примера. Мы написали несколько простых валидаторов строк, которые могут использоваться для проверки ввода пользователя на форме веб-страницы или для проверки формата стороннего файла с данными.
===== Валидаторы в одиночном файле =====
interface StringValidator {
isAcceptable(s: string): boolean;
}
let lettersRegexp = /^[A-Za-z]+$/;
let numberRegexp = /^[0-9]+$/;
class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
// Несколько тестовых примеров
let strings = ["Hello", "98052", "101"];
// Валидаторы
let validators: { [s: string]: StringValidator; } = {};
validators["ZIP code"] = new ZipCodeValidator();
validators["Letters only"] = new LettersOnlyValidator();
// Для каждой строки показывает, прошла ли она каждый валидатор
for (let s of strings) {
for (let name in validators) {
let isMatch = validators[name].isAcceptable(s);
console.log(`'${ s }' ${ isMatch ? "соответствует" : "не соответствует" } '${ name }'.`);
}
}
====== Использование пространств имён # ======
Поскольку мы добавляем больше валидаторов, нам понадобится какая-нибудь организационная схема, которая позволит отслеживать наши типы и не беспокоиться по поводу пересечений с именами других объектов. Вместо того, чтобы помещать множество различных идентификаторов в глобальное пространство имён, давайте обернём наши объекты в новое.
В данном примере мы перенесём все элементы, связанные с валидаторами, в пространство имён ''Validation''. Поскольку мы хотим, чтобы наши интерфейсы и классы были доступны извне, мы поместим перед ними ключевое слово ''export''. Напротив, переменные ''lettersRegexp'' и ''numberRegexp'' - лишь детали данной реализации, поэтому они не экспортируются и не будут видимы вне своего пространства имён. В коде тестового примера в конце файла нам нужно определить имена типов в том виде, в котором они будут использоваться вне нашего пространства имён, например ''Validation.LettersOnlyValidator''.
===== Валидаторы внутри пространства имён =====
namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
const lettersRegexp = /^[A-Za-z]+$/;
const numberRegexp = /^[0-9]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}
// Несколько тестовых примеров
let strings = ["Hello", "98052", "101"];
// Валидаторы
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();
// Для каждой строки показывает, прошла ли она каждый валидатор
for (let s of strings) {
for (var name in validators) {
console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "соответствует" : "не соответствует" } ${ name }`);
}
}
====== Разбиение на несколько файлов # ======
По мере роста нашего приложения мы захотим разбить код на насколько файлов, чтобы облегчить его поддержку.
===== Многофайловые пространства имён =====
Здесь мы разобьём пространство имён ''Validation'' на несколько файлов. Несмотря на то, что код находится в разных файлах, он может относиться к одному пространству имён и воспринимается также, как если бы он был расположен в одном месте. Поскольку между файлами есть зависимости, мы добавим ссылочные теги, чтобы указать компилятору на связи между файлами. В остальном наш тестовый код не изменится.
== Validation.ts ==
namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
}
== LettersOnlyValidator.ts ==
///
namespace Validation {
const lettersRegexp = /^[A-Za-z]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
}
== ZipCodeValidator.ts ==
///
namespace Validation {
const numberRegexp = /^[0-9]+$/;
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}
== Test.ts ==
///
///
///
// Несколько тестовых примеров
let strings = ["Hello", "98052", "101"];
// Валидаторы
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();
// Для каждой строки показывает, прошла ли она каждый валидатор
for (let s of strings) {
for (let name in validators) {
console.log(""" + s + "" " + (validators[name].isAcceptable(s) ? " соответствует " : " не соответствует ") + name);
}
}
Поскольку здесь используется несколько файлов, необходимо убедиться, что загружен весь компилируемый код. Это можно сделать двумя способами.
Во-первых, мы можем использовать объединённый вывод с помощью флага ''--outFile'', который позволяет скомпилировать все входные файлы в один выходной JavaScript:
tsc --outFile sample.js Test.ts
Компилятор автоматически упорядочит выходной файл на основе ссылочных тегов, находящихся в файлах. Вы также можете напрямую указать каждый файл:
tsc --outFile sample.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts
Кроме того, можно использовать пофайловую компиляцию (по умолчанию), при которой на каждый входной файл генерируется отдельный файл JavaScript. Если на выходе получается несколько JS-файлов, на веб-странице необходимо использовать тег ''