Пространство имён TypeScript

Наиболее явная цель пространства имён — решить проблему дублирования имён.

Предположим, есть ситуация, когда в классе два ученика по имени Сяо Мин. Чтобы чётко их различать, нам приходится использовать дополнительную информацию помимо их имён, например фамилии (Ван Сяомин, Ли Сяомин), или имена их родителей и т. д.

Пространство имён определяет видимую область действия идентификатора. Идентификатор может быть определён в нескольких пространствах имён, и его значения в разных пространствах имён не связаны друг с другом. Таким образом, любой идентификатор может быть определён в новом пространстве имён, и он не будет конфликтовать с существующими идентификаторами, потому что существующие определения находятся в других пространствах имён.

В TypeScript пространства имён определяются с помощьюnamespaceследующего синтаксиса:

namespace SomeNameSpaceName { export interface ISomeInterfaceName { } export class SomeClassName { } }

Выше определяется пространство имён SomeNameSpaceName. Если нам нужно вызывать классы и интерфейсы в SomeNameSpaceName извне, нужно добавить ключевое словоexport.

Чтобы вызвать его в другом пространстве имён, синтаксис следующий:

SomeNameSpaceName.SomeClassName;

Если пространство имён находится в отдельном файле TypeScript, на него следует ссылаться с помощью тройной косой черты ///, и синтаксис следующий:

/// <reference path = "SomeFileName.ts" />

Следующие примеры демонстрируют использование пространств имён, определённых в разных файлах:

Код файла IShape.ts:

namespace Drawing { export interface IShape { draw(); } }

Код файла Circle.ts:

/// <reference path = "IShape.ts" /> namespace Drawing { export class Circle implements IShape { public draw() { console.log("Circle нарисован"); } } }

Код файла Triangle.ts:

/// <reference path = "IShape.ts" /> namespace Drawing { export class Triangle implements IShape { public draw() { console.log("Triangle is drawn"); } } }

Код файла TestShape.ts:

/// <reference path = "IShape.ts" /> /// <reference path = "Circle.ts" /> /// <reference path = "Triangle.ts" /> function drawAllShapes(shape:Drawing.IShape) { shape.draw(); } drawAllShapes(new Drawing.Circle()); drawAllShapes(new Drawing.Triangle());

Используйте команду tsc, чтобы скомпилировать приведённый выше код:

tsc --out app.js TestShape.ts  

Получите следующий код JavaScript:

JavaScript

/// <reference path = "IShape.ts" /> var Drawing; (function (Drawing) { var Circle = /** @class */ (function () { function Circle() { } Circle.prototype.draw = function () { console.log("Круг нарисован"); }; return Circle; }()); Drawing.Circle = Circle; })(Drawing || (Drawing = {})); /// <reference path = "IShape.ts" /> var Drawing; (function (Drawing) { var Triangle = /** @class */ (function () { function Triangle() { } Triangle.prototype.draw = function () { console.log("Треугольник нарисован"); }; return Triangle; }()); Drawing.Triangle = Triangle; })(Drawing || (Drawing = {})); /// <reference path = "IShape.ts" /> /// <reference path = "Circle.ts" /> /// <reference path = "Triangle.ts" /> function drawAllShapes(shape) { shape.draw(); } drawAllShapes(new Drawing.Circle()); drawAllShapes(new Drawing.Triangle());

Используйте команду node для просмотра результата вывода:

$ node app.js
Circle is drawn
Triangle is drawn

Вложенные пространства имён

Пространства имён поддерживают вложенность, то есть можно определить пространство имён внутри другого пространства имён.

namespace namespace_name1 { export namespace namespace_name2 { export class class_name { } } }

Доступ к членам осуществляется с помощью точки.чтобы реализовать это, как в следующем примере:

Код файла Invoice.ts:

namespace Example { export namespace invoiceApp { export class Invoice { public calculateDiscount(price: number) { return price * .40; } } } }

Код файла InvoiceTest.ts:

/// <reference path = "Invoice.ts" /> var invoice = new Example.invoiceApp.Invoice(); console.log(invoice.calculateDiscount(500));

Используйте команду tsc, чтобы скомпилировать приведённый выше код:

tsc --out app.js InvoiceTest.ts

Получите следующий код JavaScript:

JavaScript

var Example; (function (Example) { var invoiceApp; (function (invoiceApp) { var Invoice = /** @class */ (function () { function Invoice() { } Invoice.prototype.calculateDiscount = function (price) { return price * .40; }; return Invoice; }()); invoiceApp.Invoice = Invoice; })(invoiceApp = Example.invoiceApp || (Example.invoiceApp = {})); })(Example || (Example = {})); /// <reference path = "Invoice.ts" /> var invoice = new Example.invoiceApp.Invoice(); console.log(invoice.calculateDiscount(500));

Используйте команду node для просмотра результата вывода:

$ node app.js
200
Другие расширения