2012-10-08 12 views
9

Para consultar el siguiente código:mecanografiado: hacer visible el interior del módulo de clase única

module MyModule { 
    class MyPrivateClass { 
     ... 
    } 

    export class MyPublicClass { 
     private var: MyPrivateClass; // MyPrivateClass is unknown 
    } 
} 

Quiero MyPrivateClass ser sólo visible en el interior MyModule, específicamente para uso interno en MyPublicClass. Fuera de MyModule, solo MyPublicClass debe estar visible. Pensé que el diseño anterior debería hacer, pero VS se queja de que MyPrivateClass no está visible dentro de MyPublicClass. Añadiendo exportación antes de la definición de MyPrivateClass lo hace visible a MyPublicClass pero luego también es visible desde el exterior.

¿Hay alguna manera de hacerlo visible a MyPublicClass solamente?

Gracias.

Respuesta

0

Hmm, no veo ningún problema con él, pero no se olvide de inicializar el valor del campo, de lo contrario el compilador no generará el campo:

module MyModule { 
    class MyPrivateClass { 

    } 

    export class MyPublicClass { 
     private instance: MyPrivateClass; // MyPrivateClass is unknown 
     constructor() { 
      this.instance = new MyPrivateClass(); 
     } 
    } 
} 
+0

Es extraño: si pego el código como el anterior (el tuyo o el mío), está bien. Pero tan pronto como cambio el nombre del módulo a su nombre real, aparece el error que describí. ¿Podría tener algo que ver con el hecho de que estoy definiendo clases en el mismo módulo en otros archivos? – vexator

+0

@vexator Sí. La especificación del lenguaje indica que _Los módulos internos son "abiertos" y las declaraciones internas del módulo con el mismo nombre calificado relativo a una raíz común (como se define en la sección 2.2) contribuyen a un único módulo. – Valentin

+0

Ok, entonces ¿qué tendría que hacer? cambiar para que funcione? – vexator

7

Aquí está un ejemplo que muestra la clase privada, la clase pública, el uso de la clase privada de la clase pública y el intento de utilizar la clase privada, que genera un error.

Si sigue apareciendo un error, ¿puede revelar el nombre que está tratando de usar para el módulo que causa el problema?

module MyModule { 
    class MyPrivateClass { 
     doSomething() { 
      return 1; 
     } 
    } 

    export class MyPublicClass { 
     private x = new MyPrivateClass(); 

     someFunction() { 
      return this.x.doSomething(); 
     } 
    } 
} 

var examplePublic = new MyModule.MyPublicClass(); 
var result = examplePublic.someFunction(); // 1 

var examplePrivate = new MyModule.MyPrivateClass(); // error 
2

Si quieren que sea privado en el emmitted JavaScript que puede hacer esto mediante el movimiento de la instancia clas privados para el interior del módulo, pero no en el lado de la clase exportado.

module MyModule { 
    class MyPrivateClass { 
     prop1: number = 1; 
    } 

    var foo: MyPrivateClass = new MyPrivateClass(); 

    export class MyPublicClass { 
     someMethod(){ 
      var bar = foo.prop1; 
     } 
    } 
} 

var x = new MyModule.MyPublicClass(); 
0

que dijo en uno de sus comentarios:

Es extraño: Si me pega el código que el anterior (el suyo o el mío), que está bien. Pero tan pronto como puedo cambiar el nombre del módulo a su nombre real, el error he descrito aparece

Esto suena muy similar a un problema que he experimentado. Fue causado porque había estado usando varias rutas de referencia para importar los módulos. Como resultado, dentro de un módulo, los miembros no podían accederse entre sí.

Lo siento, pero no recuerdo más detalles y no he podido reproducir su error (o mi). Esto es probablemente inútil, pero pensé que compartiría mi experiencia, sin embargo: mezclar rutas de referencia y módulos parece causar errores muy extraños.

Por otra parte, a veces VisualStudio se comporta de manera bastante extraña. Actualmente estoy trabajando en un proyecto mecanografiado junto con un amigo. El código está almacenado en un repositorio github. Ambos tiramos de la misma versión. Trabajé bien para mí y se roció con mensajes de error para él. Mismo sistema operativo, misma versión de Typescript, misma versión de VisualStudio, ... Curiosamente, el error también estaba relacionado con los módulos. Un módulo que se importó parecía estar "vacío".Todo el código que intentó usar el contenido de este módulo se marcó en rojo. Reinició VisualStudio y, de repente, el código fue aceptado como válido. ¡No cambiamos nada! Se compiló sin problemas, también.

Cuestiones relacionadas