overload - typescript templates
¿Por qué Typescript utiliza la palabra clave "export" para hacer que las clases y las interfaces sean públicas? (2)
Algunas cosas para agregar a la respuesta de Steve Fenton:
-
export
ya significa dos cosas diferentes (dependiendo de si está en el nivel superior o no); lo que significa que un tercero es probablemente peor que agregarpublic
/private
- Definitivamente no es para facilitar la implementación; la complejidad añadida de
public
vsexport
es trivial. Ya hemos cambiado las palabras clave de un grupo; no es dificil. - La visibilidad predeterminada de los miembros de la clase debe ser pública para alinearse con la propuesta de la clase ES6, por lo tanto, necesitamos alguna palabra clave para indicar "no pública". No hay un antónimo adecuado para
export
(¿no?), Por lo que la elección lógica esprivate
. Una vez que tengaprivate
, sería un poco loco no elegirpublic
como su contraparte - El uso de
export
para modificar la visibilidad en los módulos internos es la mejor alineación con los módulos ES6
Mientras incursioné con Typescript me di cuenta de que mis clases dentro de módulos (usadas como espacios de nombres) no estaban disponibles para otras clases a menos que escribiera la palabra clave export
antes de ellas, como por ejemplo:
module some.namespace.here
{
export class SomeClass{..}
}
Así que ahora puedo usar el código anterior de esta manera:
var someVar = new some.namespace.here.SomeClass();
Sin embargo, me preguntaba por qué se usa esta palabra clave en lugar de simplemente usar la palabra clave public
que se utiliza a nivel de método para indicar que un método o propiedad debe ser accesible externamente. Entonces, ¿por qué no simplemente usar este mismo mecanismo para hacer que las clases e interfaces, etc. sean visibles externamente?
Esto daría el código resultante como:
module some.namespace.here
{
public class SomeClass{..}
}
La razón principal es que la export
coincide con los planes para ECMAScript. Se podría argumentar que "deberían haber usado" exportar "en lugar de" público ", pero aparte de" exportar / proteger / proteger "siendo un conjunto de modificadores de acceso pobremente emparejados, creo que hay una sutil diferencia entre los dos que explica esto. .
En TypeScript, marcar a un miembro de la clase como public
o private
no tiene ningún efecto en el JavaScript generado. Es simplemente una herramienta de tiempo de diseño / compilación que puede usar para evitar que su código TypeScript acceda a cosas que no debería.
Con la palabra clave export
, el JavaScript agrega una línea para agregar el elemento exportado al módulo. En su ejemplo: here.SomeClass = SomeClass;
.
Así que, conceptualmente, la visibilidad controlada por public
y private
es solo para herramientas, mientras que la palabra clave de export
cambia la salida.