typescript1.4 - Typescript: Classe privada que é visível para classes no mesmo módulo em arquivos diferentes
Meu projeto usa a abordagem de 'módulos internos de vários arquivos'. Durante a construção, tudo é compilado em um único arquivo Javascript.
Uma coisa que ainda me incomoda é que não consigo encontrar uma maneira de ter classes de nível de módulo privadas (não exportadas para o arquivo de definição) que ainda sejam visíveis e utilizáveis por classes no mesmo módulo que residem em arquivos separados (ou seja, classes internas do C#). Alguma sugestão?
Foo.ts:
module shared {
class Foo {
}
}
Bar.ts:
module shared {
export class Bar {
constructor() {
this.foo = new shared.Foo();
}
}
}
Baz.ts:
module shared {
export class Baz {
constructor() {
this.foo = new shared.Foo();
}
}
}
Resposta #1
Não há uma solução do lado da linguagem para isso. Há dois aspectos para explicar por que isso acontece -- o que os consumidores do seu código veem e como o JavaScript é gerado.
Do lado de emissão, ou shared::Foo é um membro exportado do objeto shared, ou não é. Se não for exportado, shared:Baz não poderá vê-lo e será incapaz de usá-lo. Portanto, qualquer classe 'interna' em um módulo obviamente precisa ser exportada em termos de emissão.
Do lado do consumo, há um perigo sutil aqui. Digamos que isso aconteceu:
// ** YourCode.d.ts **
declare module shared {
class Bar { ... }
class Baz { ... }
}
// ** SomeConsumer.ts **
// Hey, 'shared' is a good namespace!
module shared {
// My own personal Foo
export class Foo {
}
}
O que acabou de acontecer? Um usuário do seu código acabou de pisar no membro shared.Foo sem perceber. Tudo vai quebrar em tempo de execução. O conjunto de membros perigosos que quebram o universo é um campo minado não documentado.
A melhor solução se você tiver alguns membros que devem ser usados externamente e outros que não devem é usar um módulo aninhado chamado algo como Internal ou Implementation para indicar aos consumidores que eles realmente não devem usar esses objetos por conta própria.
