Для организации больших программ предназначены пространства имен. Пространства имен содержат группу классов, интерфейсов, функций, других пространств имен, которые могут использоваться в некотором общем контексте.
Для определения пространств имен используется ключевое слово namespace:
namespace Personnel { export class Employee { constructor(public name: string){ } } }
В данном случае пространство имен называется Personnel
, и оно содержит класс Employee. Чтобы типы и объекты,
определенные в пространстве имен, были видны извне, они определяются с ключевым словом export. В этом случае во вне
мы сможем использовать класс Employee:
namespace Personnel { export class Employee { constructor(public name: string){ } } } let alice = new Personnel.Employee("Alice"); console.log(alice.name); // Alice
При этом пространства имен могут содержать и интерфейсы, и объекты, и функции, и даже обычные переменные и константы:
namespace Personnel { export interface IUser{ displayInfo(): void; } export class Employee { constructor(public name: string){ } } export function work(emp: Employee) : void{ console.log(emp.name, "is working"); } export let defaultUser= { name: "Kate" } export let value = "Hello"; } let tom = new Personnel.Employee("Tom") Personnel.work(tom); // Tom is working console.log(Personnel.defaultUser.name); // Kate console.log(Personnel.value); // Hello
Нередко пространства имен определяются в отдельных файлах. Например, определим файл personnel.ts со следующим кодом:
namespace Personnel { export class Employee { constructor(public name: string){ } } export class Manager { constructor(public name: string){ } } }
И в той же папке определим главный файл приложения app.ts:
/// <reference path="personnel.ts" /> let tom = new Personnel.Employee("Tom") console.log(tom.name); let sam = new Personnel.Manager("Sam"); console.log(sam.name);
С помощью директивы /// <reference path="personnel.ts" />
подключается файл personnel.ts.
Далее нам надо объединить оба файла в один файл, который затем можно подключать на веб-страницу. Для этого при компиляции указывается опция:
--outFile target.js sourse1.ts source2.ts source3.ts ...
Опции outFile в качестве первого параметра передается название файла, который будет генерироваться. А последующие параметры - файлы с кодом TypeScript, которые будут компилироваться.
То есть в данном случае нам надо выполнить в консоли команду
tsc --outFile app.js app.ts personnel.ts
В итоге будет создан один файл app.js.
Пространства имен могут быть вложенными:
namespace Data{ export namespace Personnel { export class Employee { constructor(public name: string){ } } } export namespace Clients { export class VipClient { constructor(public name: string){ } } } } let tom = new Data.Personnel.Employee("Tom") console.log(tom.name); let sam = new Data.Clients.VipClient("Sam"); console.log(sam.name);
Причем вложенные пространства имен определяются со словом export. Соответственно при обращении к типам надо использовать все пространства имен.
Возможно, нам приходится создавать множество объектов Data.Personnel.Employee
, но каждый раз набирать полное
имя класса с учетом пространств имен, вероятно, не всем понравиться, особенно когда модули имеют глубокую вложенность по принципу матрешки.
Чтобы сократить объем кода, мы можем использовать псевдонимы, задаваемые с помощью ключевого слова import.
Например:
namespace Data{ export namespace Personnel { export class Employee { constructor(public name: string){ } } } } import employee = Data.Personnel.Employee; let tom = new employee("Tom") console.log(tom.name);
После объявления псевдонима employee
будет рассматриваться как краткое имя для Data.Personnel.Employee
.