web-dev-qa-db-fra.com

Pourquoi TypeScript utilise-t-il le mot clé "export" pour rendre les classes et les interfaces publiques?

En manipulant TypeScript, j'ai réalisé que mes classes dans les modules (utilisés comme espaces de noms) n'étaient pas disponibles pour les autres classes, sauf si j'avais écrit le mot clé export avant, comme:

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é était utilisé par opposition à l’utilisation du mot clé public utilisé au niveau de la méthode pour indiquer qu’une méthode ou une propriété devait être accessible de l’extérieur. Alors pourquoi ne pas simplement utiliser ce même mécanisme pour rendre visibles les classes, les interfaces, etc.

Cela donnerait le code résultant comme:

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

La raison principale est que export correspond aux plans de ECMAScript. Vous pourriez faire valoir qu '"ils auraient dû utiliser" export "au lieu de" public ", mais mis à part que" export/private/protected "est un ensemble mal adapté de modificateurs d'accès, je pense qu'il existe une différence subtile entre les deux qui explique cette .

Dans TypeScript, marquer un membre de la classe comme public ou private n'a aucun effet sur le code JavaScript généré. C'est simplement un outil de conception/compilation que vous pouvez utiliser pour empêcher votre code TypeScript d'accéder à des éléments qu'il ne devrait pas.

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

Donc, conceptuellement, la visibilité contrôlée par public et private ne concerne que l’outillage, alors que le mot clé export modifie la sortie.

159
Fenton

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

  • exportdéjà signifie deux choses différentes (selon que c'est au plus haut niveau ou non); faire en sorte qu'un tiers soit probablement pire que d'ajouter public/private
  • Ce n'est certainement pas pour faciliter la mise en œuvre; la complexité ajoutée de public vs export est triviale. Nous avons déjà changé les mots-clés autour d'un tas déjà; 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. Par conséquent, nous avons besoin d'un mot clé pour indiquer "non public". Il n'y a pas d'antonyme approprié pour export (unexport ??), alors private est le choix logique. Une fois que vous avez private, il serait un peu fou de ne pas choisir public comme contrepartie
  • L'utilisation de export pour modifier la visibilité dans les modules internes est le meilleur alignement avec les modules ES6
45
Ryan Cavanaugh