Пространство имен — это способ логически сгруппировать связанный код. Это встроено в TypeScript в отличие от JavaScript, где объявления переменных входят в глобальную область, и если в одном проекте используется несколько файлов JavaScript, будет возможность перезаписать или неправильно интерпретировать одни и те же переменные, что приведет к «проблеме загрязнения глобального пространства имен» в JavaScript.
Определение пространства имен
Определение пространства имен начинается с ключевого слова namespace, за которым следует имя пространства имен следующим образом:
namespace SomeNameSpaceName { export interface ISomeInterfaceName { } export class SomeClassName { } }
Классы или интерфейсы, к которым следует обращаться за пределами пространства имен, должны быть помечены ключевым словом export .
Чтобы получить доступ к классу или интерфейсу в другом пространстве имен, синтаксис будет namespaceName.className
SomeNameSpaceName.SomeClassName;
Если первое пространство имен находится в отдельном файле TypeScript, то на него следует ссылаться с использованием синтаксиса с тройной косой чертой.
/// <reference path = "SomeFileName.ts" />
Следующая программа демонстрирует использование пространств имен —
FileName :IShape.ts ---------- namespace Drawing { export interface IShape { draw(); } } FileName :Circle.ts ---------- /// <reference path = "IShape.ts" /> namespace Drawing { export class Circle implements IShape { public draw() { console.log("Circle is drawn"); } FileName :Triangle.ts ---------- /// <reference path = "IShape.ts" /> namespace Drawing { export class Triangle implements IShape { public draw() { console.log("Triangle is drawn"); } } FileName : 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 --out app.js TestShape.ts node app.js
При компиляции он сгенерирует следующий код JavaScript (app.js).
//Generated by typescript 1.8.10 /// <reference path = "IShape.ts" /> var Drawing; (function (Drawing) { var Circle = (function () { function Circle() { } Circle.prototype.draw = function () { console.log("Cirlce is drawn"); }; return Circle; }()); Drawing.Circle = Circle; })(Drawing || (Drawing = {})); /// <reference path = "IShape.ts" /> var Drawing; (function (Drawing) { var Triangle = (function () { function Triangle() { } Triangle.prototype.draw = function () { console.log("Triangle is drawn"); }; 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());
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Circle is drawn Triangle is drawn
Вложенные пространства имен
Вы можете определить одно пространство имен внутри другого пространства имен следующим образом:
namespace namespace_name1 { export namespace namespace_name2 { export class class_name { } } }
Вы можете получить доступ к членам вложенного пространства имен, используя оператор точки (.) Следующим образом:
FileName : Invoice.ts namespace tutorialPoint { export namespace invoiceApp { export class Invoice { public calculateDiscount(price: number) { return price * .40; } } } } FileName: InvoiceTest.ts /// <reference path = "Invoice.ts" /> var invoice = new tutorialPoint.invoiceApp.Invoice(); console.log(invoice.calculateDiscount(500));
Приведенный выше код может быть скомпилирован и выполнен с помощью следующей команды —
tsc --out app.js InvoiceTest.ts node app.js
При компиляции он сгенерирует следующий код JavaScript (app.js).
//Generated by typescript 1.8.10 var tutorialPoint; (function (tutorialPoint) { var invoiceApp; (function (invoiceApp) { var Invoice = (function () { function Invoice() { } Invoice.prototype.calculateDiscount = function (price) { return price * .40; }; return Invoice; }()); invoiceApp.Invoice = Invoice; })(invoiceApp = tutorialPoint.invoiceApp || (tutorialPoint.invoiceApp = {})); })(tutorialPoint || (tutorialPoint = {})); /// <reference path = "Invoice.ts" /> var invoice = new tutorialPoint.invoiceApp.Invoice(); console.log(invoice.calculateDiscount(500));
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —