TypeScript - namespaces
Um namespace é uma maneira de agrupar logicamente o código relacionado. Isso é embutido no TypeScript, ao contrário do JavaScript, onde as declarações de variáveis vão para um escopo global e se vários arquivos JavaScript forem usados dentro do mesmo projeto, haverá a possibilidade de sobrescrever ou interpretar incorretamente as mesmas variáveis, o que levará ao "problema de poluição do namespace global" em JavaScript.
Definindo um Namespace
Uma definição de namespace começa com a palavra-chave namespace seguido pelo nome do namespace da seguinte forma -
namespace SomeNameSpaceName {
export interface ISomeInterfaceName { }
export class SomeClassName { }
}
As classes ou interfaces que devem ser acessadas fora do namespace devem ser marcadas com a palavra-chave export.
Para acessar a classe ou interface em outro namespace, a sintaxe será namespaceName.className
SomeNameSpaceName.SomeClassName;
Se o primeiro namespace estiver em um arquivo TypeScript separado, ele deve ser referenciado usando a sintaxe de referência de barra tripla.
/// <reference path = "SomeFileName.ts" />
O programa a seguir demonstra o uso de namespaces -
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());
}
}
}
O código acima pode ser compilado e executado usando o seguinte comando -
tsc --out app.js TestShape.ts
node app.js
Na compilação, ele irá gerar o seguinte código 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());
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Circle is drawn
Triangle is drawn
Namespaces aninhados
Você pode definir um namespace dentro de outro namespace da seguinte maneira -
namespace namespace_name1 {
export namespace namespace_name2 {
export class class_name { }
}
}
Você pode acessar membros do namespace aninhado usando o operador ponto (.) Da seguinte maneira -
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));
O código acima pode ser compilado e executado usando o seguinte comando -
tsc --out app.js InvoiceTest.ts
node app.js
Na compilação, ele irá gerar o seguinte código 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));
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
200