Pourquoi Typescript utilise-t-il le mot clé “export” pour rendre les classes et les interfaces publiques?

Pendant que je me mêlais avec Typescript, je me suis rendu compte que mes classes dans les modules (utilisées comme espaces de noms) n’étaient pas disponibles pour les autres classes à moins que j’écrive le mot-clé d’ export avant:

 module some.namespace.here { export class SomeClass{..} } 

Alors maintenant, je peux utiliser le code ci-dessus comme ceci:

 var someVar = new some.namespace.here.SomeClass(); 

Cependant, je me demandais simplement pourquoi ce mot clé est utilisé en opposition à l’utilisation du mot clé public utilisé au niveau de la méthode pour indiquer qu’une méthode ou une propriété doit être accessible en externe. Alors, pourquoi ne pas simplement utiliser ce même mécanisme pour rendre les classes, les interfaces, etc. visibles en externe?

Cela donnerait le code résultant comme:

 module some.namespace.here { public class SomeClass{..} } 

La principale raison est que l’ export correspond aux plans pour ECMAScript. Vous pourriez dire que “ils auraient dû utiliser” export “au lieu de” public “, mais à part” export / private / protected “étant un ensemble de modificateurs d’access mal assorti, je pense qu’il existe une différence subtile entre les deux. .

Dans TypeScript, le marquage d’un membre de classe comme public ou private n’a aucun effet sur le code JavaScript généré. Il s’agit simplement d’un outil de conception / compilation que vous pouvez utiliser pour arrêter l’access de votre code TypeScript aux éléments qu’il ne doit pas utiliser.

Avec le mot-clé export , le JavaScript ajoute une ligne pour append l’élément exporté au module. Dans votre exemple: here.SomeClass = SomeClass; .

En théorie, la visibilité contrôlée par le public et le private ne concerne que l’outillage, tandis que le mot clé d’ export modifie la sortie.

Quelques éléments à append à la réponse de Steve Fenton:

  • export signifie déjà deux choses différentes (selon que ce soit au niveau supérieur ou non); ce qui signifie un tiers est probablement pire que l’ajout public / private
  • Ce n’est certainement pas pour faciliter la mise en œuvre. la complexité supplémentaire de public vs export est sortingviale. Nous avons déjà changé les mots-clés autour d’un groupe; ce n’est pas difficile.
  • La visibilité par défaut des membres de la classe doit être publique pour s’aligner sur la proposition de classe ES6. Nous avons donc besoin d’un mot clé pour indiquer “non public”. Il n’y a pas d’antonyme approprié à export ( unexport ??), donc le private est le choix logique. Une fois que vous avez private , il serait un peu fou de ne pas choisir le public comme contrepartie
  • L’utilisation de l’ export pour modifier la visibilité dans les modules internes correspond à l’alignement optimal avec les modules ES6