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: 50Aqui, 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: 27Neste 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
exportpara 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.