Quels modificateurs d'accès sont impliqués lorsqu'ils ne sont pas spécifiés?

138

Pour tous les différents concepts prenant en charge les modificateurs d'accès, tels que les champs, les propriétés, les méthodes et les classes, quels modificateurs d'accès sont impliqués s'ils ne sont pas spécifiés?

Sam
la source
@basarat, cela fait longtemps que j'utilise TypeScript, il est donc difficile de se rappeler comment cela fonctionne ces jours-ci! Pour autant que je me souvienne, votre réponse semblait raisonnable, mais je ne pensais pas qu'elle faisait suffisamment autorité pour que je la marque comme correcte. Votre réponse est-elle basée sur votre expérience de la langue, ou est-elle issue des informations contenues dans les spécifications?
Sam
basé sur la spécification github.com/Microsoft/TypeScript/blob/master/doc/spec.md
basarat
1
Afin de clarifier cette question et cette réponse, la dactylographie aurait dû être spécifiée dans la question pour que ce soit clair. Il existe une balise dactylographiée, mais c'est la seule indication que nous ne discutons pas de scala, java, C #, C ++, ....
absmiths

Réponses:

216

Tout dans a classest publicsinon spécifié. Tout dans a moduleest privé à moins que le exportmot clé ne soit utilisé.

basarat
la source
6
Pour les personnes jouant avec un kit de démarrage. Certains d'entre eux sont livrés avec tslint et cela peut être très déroutant. Lorsque vous voyez ce message default access modifier on member/method not allowed Cochez tslint.jsonpour autoriser le modificateur d'accès par défaut ou implicite.
visheshd
1
Serait-il possible d'utiliser une étape pré-transpile pour attribuer automatiquement private?
Qwerty
-4

Je ne suis pas d'accord que

Tout dans une classe est public s'il n'est pas spécifié.

Tout est public, même si privé est utilisé. Regardez simplement le code transpilé. Les méthodes annotées privées seront accessibles au public. Seul le transpiling provoquera des erreurs. Le public et le privé seront convertis en<Object>.prototype.funcName

Jens Peters
la source
24
Oui, c'est un bon point. Cependant, ma question était which access modifiers are implied when not specifiedplutôt que can my code be accessed when an access modifier is not specified. Les modificateurs d'accès sont un concept TypeScript plutôt qu'un concept JavaScript. Je pense donc que la réponse de @ basarat a répondu à ce que je voulais dire dans la question et semble être correcte dans le contexte de la question. Peut-être y a-t-il lieu de lever l'ambiguïté du libellé de la question et de la réponse.
Sam
C'est comme ça que TS fonctionne, il compilera votre code, peu importe s'il est "correct" du point de vue TS, cela implique à tout dans TS sans exception aux classes, mais le point principal est que si vous respectez les avertissements TS - vous ne le ferez pas accéder aux propriétés marquées comme privées.
Andrew Bogdanov
3
Je ne peux penser à aucune langue où quelque chose est réellement privé. En C #, vous pouvez facilement accéder à n'importe quel champ privé par réflexion. Dans les langages de niveau inférieur comme C ou C ++, vous pouvez accéder aux champs privés simplement en déplaçant des pointeurs. À court des sauvegardes au niveau du système d'exploitation, comme le DEP et la mémoire chiffrée, les modificateurs d'accès ne sont qu'une assistance fournie par le compilateur pour vous aider à écrire un meilleur code. ...Droite?
pbarranis
Les champs JavaScript privés @pbarranis sont en fait privés et il n'y a aucun moyen d'y accéder depuis le runtime JavaScript.
Yogu