Aparência
Namespaces
Namespaces são uma forma de organizar e agrupar código no TypeScript, especialmente útil para evitar conflitos de nomes em projetos maiores. Eles permitem encapsular classes, interfaces, funções e variáveis em um espaço de nomes específico, tornando o código mais modular e gerenciável.
Definindo Namespaces
Para definir um namespace, você usa a palavra-chave namespace
seguida pelo nome do namespace e um bloco de código que contém os membros do namespace.
typescript
namespace Geometry {
export class Circle {
constructor(public radius: number) {}
area(): number {
return Math.PI * this.radius * this.radius;
}
}
export class Rectangle {
constructor(public width: number, public height: number) {}
area(): number {
return this.width * this.height;
}
}
}
Neste exemplo, definimos um namespace chamado Geometry
que contém duas classes: Circle
e Rectangle
. Note que usamos a palavra-chave export
para tornar essas classes acessíveis fora do namespace.
Usando Namespaces
Para usar membros de um namespace, você precisa referenciá-los com o nome do namespace seguido por um ponto e o nome do membro.
typescript
const circle = new Geometry.Circle(5);
console.log(circle.area()); // Saída: 78.53981633974483
const rectangle = new Geometry.Rectangle(10, 5);
console.log(rectangle.area()); // Saída: 50
Aqui, estamos criando instâncias das classes Circle
e Rectangle
dentro do namespace Geometry
e chamando seus métodos area
.
Namespaces Aninhados
Você pode aninhar namespaces dentro de outros namespaces para uma organização ainda melhor do código.
typescript
namespace Geometry {
export namespace ThreeD {
export class Cube {
constructor(public sideLength: number) {}
volume(): number {
return this.sideLength ** 3;
}
}
}
}
const cube = new Geometry.ThreeD.Cube(3);
console.log(cube.volume()); // Saída: 27
Neste exemplo, criamos um namespace aninhado ThreeD
dentro do namespace Geometry
, que contém a classe Cube
.
Dividindo Namespaces em Múltiplos Arquivos
Para projetos maiores, você pode querer dividir um namespace em vários arquivos. Use a mesma definição de namespace em cada arquivo e certifique-se de que eles sejam combinados corretamente durante a compilação.
arquivo1.ts:
typescript
namespace Geometry {
export class Circle {
constructor(public radius: number) {}
area(): number {
return Math.PI * this.radius * this.radius;
}
}
}
arquivo2.ts:
typescript
namespace Geometry {
export class Rectangle {
constructor(public width: number, public height: number) {}
area(): number {
return this.width * this.height;
}
}
}
Para compilar esses arquivos e combiná-los em um único arquivo de saída, você pode usar a opção outFile
no tsconfig.json
.
tsconfig.json:
json
{
"compilerOptions": {
"outFile": "./dist/bundle.js"
},
"include": ["arquivo1.ts", "arquivo2.ts"]
}
Execute o comando tsc
para compilar os arquivos e gerar o arquivo bundle.js
.
Considerações e Melhores Práticas
- Modularidade: Use namespaces para modularizar seu código e evitar conflitos de nomes, especialmente em projetos grandes.
- Exports: Sempre use a palavra-chave
export
para tornar membros do namespace acessíveis fora do namespace. - Organização: Aninhar namespaces pode ajudar a organizar melhor seu código, mas use com moderação para evitar complexidade excessiva.
- Alternativas: Em projetos modernos, considere o uso de módulos ES6, que são uma alternativa mais poderosa e amplamente adotada para organizar e modularizar código.
Namespaces são uma ferramenta poderosa no TypeScript para organizar seu código, mas é importante usá-los de maneira equilibrada para manter o código limpo e gerenciável.