typescript1.4 - Typescript: Clase privada que es visible para clases en el mismo módulo en diferentes archivos
Mi proyecto utiliza el enfoque de 'módulos internos de múltiples archivos'. Durante la compilación, todo se compila en un solo archivo de Javascript.
Una cosa que todavía me molesta es que no puedo encontrar una manera de tener clases a nivel de módulo privadas (no exportadas al archivo de definición) que aún sean visibles y utilizables por clases en el mismo módulo que residen en archivos separados (es decir, clases internas de C#). ¿Alguna sugerencia?
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();
}
}
}
Respuesta #1
No hay una solución a nivel de lenguaje para esto. Hay dos aspectos por los que este es el caso: lo que los consumidores de tu código ven y cómo se emite el JavaScript.
Desde el lado de emisión, o bien shared::Foo es un miembro exportado del objeto shared, o no lo es. Si no está exportado, shared:Baz no puede verlo y no podrá usarlo. Así que cualquier clase 'interna' en un módulo obviamente necesita ser exportada en términos de emisión.
Desde el lado del consumo, hay un peligro sutil aquí. Digamos que esto ocurrió:
// ** 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 {
}
}
¿Qué acaba de pasar? Un usuario de tu código acaba de pisotear el miembro shared.Foo sin darse cuenta. Todo se va a romper en tiempo de ejecución. El conjunto de miembros peligrosos que rompen el universo es un campo minado no documentado.
La mejor solución si tienes algunos miembros que deberían usarse externamente y algunos que no debería ser usar un módulo anidado llamado algo así como Internal o Implementation para indicar a los consumidores que realmente no deberían usar esos objetos por sí mismos.
