Namespaces - TypeScript

Namespaces (os espaços de nomes) são utilizados para organizar programas grandes. Os namespaces podem conter classes, interfaces, objetos, funções, variáveis e constantes que são usados em um contexto comum.

Para definir espaços de nomes, utiliza-se a palavra-chave namespace:

namespace Personnel {
    export class Employee {
        constructor(public name: string) {
        }
    }
}

Neste caso, o namespace é chamado Personnel, e ele contém a classe Employee. Para que os tipos e objetos definidos no namespace sejam visíveis externamente, eles são declarados com a palavra-chave export. Assim, podemos utilizar a classe Employee fora do namespace:

namespace Personnel {
    export class Employee {
        constructor(public name: string) {
        }
    }
}

let alice = new Personnel.Employee("Alice");
console.log(alice.name); // Alice

Os namespaces podem conter interfaces, objetos, funções e até mesmo variáveis e constantes comuns:

namespace Personnel {

    export interface IUser {
        displayInfo(): void;
    }
    
    export class Employee {
        constructor(public name: string) {
        }
    }
    
    export function work(emp: Employee): void {
        console.log(emp.name, "is working");
    }
    
    export let defaultUser = { name: "Kate" };
    
    export let value = "Hello";
}

let tom = new Personnel.Employee("Tom");
Personnel.work(tom); // Tom is working

console.log(Personnel.defaultUser.name); // Kate
console.log(Personnel.value); // Hello

Namespace em Arquivo Separado

Frequentemente, namespaces são definidos em arquivos separados. Por exemplo, definimos o arquivo personnel.ts com o seguinte código:

namespace Personnel {
    export class Employee {
        constructor(public name: string) {
        }
    }
    export class Manager {
        constructor(public name: string) {
        }
    }
}

E, na mesma pasta, definimos o arquivo principal da aplicação app.ts:

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

let tom = new Personnel.Employee("Tom");
console.log(tom.name);

let sam = new Personnel.Manager("Sam");
console.log(sam.name);

A diretiva /// <reference path="personnel.ts" /> inclui o arquivo personnel.ts.

Em seguida, precisamos unir ambos os arquivos em um único arquivo que pode ser incluído na página web. Para isso, na compilação, especificamos a opção:

--outFile target.js source1.ts source2.ts source3.ts ...

A opção --outFile recebe como primeiro parâmetro o nome do arquivo que será gerado. Os parâmetros seguintes são os arquivos TypeScript que serão compilados.

Neste caso, executamos no console o comando:

tsc --outFile app.js app.ts personnel.ts

Como resultado, será criado um único arquivo app.js.

Namespaces Aninhados

Namespaces podem ser aninhados:

namespace Data {
    export namespace Personnel {
        export class Employee {
            constructor(public name: string) {
            }
        }
        export namespace Clients {
            export class VipClient {
                constructor(public name: string) {
            }
        }
    }
}

let tom = new Data.Personnel.Employee("Tom");
console.log(tom.name);

let sam = new Data.Clients.VipClient("Sam");
console.log(sam.name);

Observe que os namespaces aninhados são definidos com a palavra-chave export. Ao acessar os tipos definidos em namespaces aninhados, é necessário usar todos os namespaces correspondentes.

Aliases

Pode ser que precisemos criar muitos objetos Data.Personnel.Employee, mas digitar o nome completo da classe com todos os namespaces pode ser inconveniente, especialmente quando os módulos têm uma profundidade de aninhamento grande. Para reduzir o código, podemos usar aliases, definidos com a palavra-chave import. Por exemplo:

namespace Data {
    export namespace Personnel {
        export class Employee {
            constructor(public name: string) {
            }
        }
    }
}

import employee = Data.Personnel.Employee;
let tom = new employee("Tom");
console.log(tom.name);

Após declarar o alias, employee será considerado um nome abreviado para Data.Personnel.Employee.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com