Pesquisa de site

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.