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

136

En barbotant avec 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 à moins que j'aie écrit le exportmot - clé avant elles, tel que:

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é par opposition à la simple utilisation du publicmot - clé qui est utilisé au niveau de la méthode pour signifier qu'une méthode ou une propriété doit être accessible de l'extérieur. Alors pourquoi ne pas simplement utiliser ce même mécanisme pour rendre les classes et les interfaces, etc. visibles de l'extérieur?

Cela donnerait un code résultant comme:

module some.namespace.here
{
   public class SomeClass{..}
}
Grofit
la source

Réponses:

177

La raison principale est que cela exportcorrespond aux plans d'ECMAScript. Vous pourriez affirmer qu '"ils auraient dû utiliser" export "au lieu de" public ", mais à part" export / privé / protégé "étant un ensemble de modificateurs d'accès mal assorti, je pense qu'il y a une différence subtile entre les deux qui explique cela .

Dans TypeScript, marquer un membre de classe comme publicou privaten'a aucun effet sur le 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 choses qu'il ne devrait pas.

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

Donc, conceptuellement, la visibilité est contrôlée par publicet privateest juste pour l'outillage, alors que le exportmot - clé change la sortie.

Fenton
la source
1
Merci pour l'information, je suppose que la décision était comme vous le dites d'éviter d'avoir à vérifier le contexte du mot-clé, ce qui est dommage car on a l'impression que c'est quelque chose qui va faire trébucher quelques personnes et qui n'a vraiment aucune différence logique de comportement comment vous vous attendez à ce que le public agisse, facilite simplement leur implémentation.
Grofit
Merci pour cela. Ça me sauve les cheveux.
Kent Aguilar
1
Il est nécessaire si vous utilisez des modules. Si votre application est du côté le plus large, les modules sont généralement un meilleur choix que la création de gros lots / le chargement de tous vos fichiers à l'avance.
Fenton
@Fenton Ne vouliez-vous pas dire "vous pourriez dire qu'ils auraient dû utiliser" public "au lieu de" export "?
Alan Evangelista
@AlanEvangelista, vous pourriez certainement l'argumenter de cette façon aussi, surtout si votre arrière-plan était Java / C # plutôt que JavaScript.
Fenton
49

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

  • export signifie déjà deux choses différentes (selon que c'est au plus haut niveau ou non); ce qui signifie qu'un tiers est probablement pire que d'ajouter public/private
  • Ce n'est certainement pas pour faciliter la mise en œuvre; la complexité supplémentaire de publicvs exportest triviale. Nous avons déjà changé de mots-clés autour d'un tas; 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é pour export( unexport??), c'est donc privatele choix logique. Une fois que vous l'avez private, il serait un peu fou de ne pas choisir publiccomme son homologue
  • L'utilisation de exportpour modifier la visibilité dans les modules internes est le meilleur alignement avec les modules ES6
Ryan Cavanaugh
la source
1
merci pour les informations supplémentaires, je suis tout à fait d'accord avec le fait que le public / privé soit au niveau des membres, je trouve juste étrange de ne pas être suffisant pour tous les niveaux d'accès. Cependant c'est une opinion personnelle et un mot-clé est un mot-clé, je voulais juste en savoir plus.
Grofit
5
Je rédige ma déclaration effrontée sur la facilité de mise en œuvre et offre un +1 en guise d'excuses :)
Fenton
2
Je suis d'accord avec certains de ce que vous dites mais je ne suis pas d'accord avec l'affirmation "Il n'y a pas d'antonyme approprié à exporter" - "importer" est l'antonyme, et c'est ce que TypeScript utilise, lorsque vous définissez une classe exportable, vous importez-le dans d'autres fichiers export class User { name: string } Un autre fichier: import {User} from ""./the_file_path_to_the_user_class; voir la section 3.3 de la documentation nativescript
Adam Diament
3
Comment utiliser importpour indiquer "cette valeur n'est pas exportée " serait-il une utilisation appropriée du mot-clé?
Ryan Cavanaugh le
5
"Il n'y a pas d'antonyme approprié pour exporter (annuler l'exportation ??)" - un antonyme approprié pour l'exportation devrait être l'embargo.
rsp