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{..}
}
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.
Quelques éléments à ajouter à la réponse de Steve Fenton:
export
dé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
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.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 contrepartieexport
pour modifier la visibilité dans les modules internes est le meilleur alignement avec les modules ES6