Які модифікатори доступу мають на увазі, коли вони не вказані?


138

Для всіх різних понять, які підтримують модифікатори доступу, такі як поля, властивості, методи та класи, які модифікатори доступу мають на увазі, якщо вони не вказані?


@basarat, давно минув час, коли я використовував TypeScript, тому важко згадати, як це працює в ці дні! Наскільки я пам'ятаю, ваша відповідь виглядала розумною, але я не вважав, що це досить авторитетно, щоб я позначив її правильною. Ваша відповідь базується на вашому досвіді роботи з мовою, чи виходить з інформації в специфікаціях?
Сем

на основі специфікації github.com/Microsoft/TypeScript/blob/master/doc/spec.md
basarat

1
Для уточнення цього питання та відповіді в запитанні слід було б вказати машинопис, щоб це було зрозуміло. Існує тег машинопису, але це єдиний показник, коли ми не обговорюємо skala, java, C #, C ++, ....
абсміти

Відповіді:


216

Все в а classє publicякщо не вказано. Все в moduleприватному приватному, якщо exportне використовується ключове слово.


6
Для людей, які грають зі стартерним набором. Деякі з них поставляються з цлінтом, і це може стати дуже заплутаним. Коли ви бачите це повідомлення, default access modifier on member/method not allowed встановіть прапорець, tslint.jsonщоб дозволити модифікатор доступу за замовчуванням або непрямий доступ.
visheshd

1
Чи можна було б використовувати крок попереднього перенесення для автоматичного призначення private?
Qwerty

-4

Я не згоден з цим

Все в класі є загальнодоступним, якщо не вказано.

Все публічно, навіть якщо приватне використовується. Просто подивіться на перекладений код. Приватні анотовані методи будуть доступні для всіх. Лише трансляція призведе до помилок. Будуть перетворені як державні, так і приватні<Object>.prototype.funcName


24
Так, це хороший момент. Однак моє запитання було which access modifiers are implied when not specifiedрадше, ніж can my code be accessed when an access modifier is not specified. Модифікатори доступу - це концепція TypeScript, а не JavaScript. Тому я думаю, що відповідь @ basarat стосувалася того, що я мав на увазі під питанням, і, здається, є правильним у контексті питання. Можливо, є якесь місце для розмежування формулювань у питанні та відповіді.
Сем

Ось так працює TS, він буде складати ваш код незалежно від того, чи він "правильний" з точки зору TS, це означає все, що в TS, не виключаючи класів, але головне, якщо ви поважаєте попередження TS - ви не будете мати доступ до властивостей, позначених як приватні.
Андрій Богданов

3
Я не можу придумати жодної мови, де щось насправді є приватним. В C # ви можете легко потрапити на будь-яке приватне поле через рефлексію. На мовах нижчого рівня, таких як C або C ++, ви можете дістатися до приватних полів, просто переміщаючи вказівники. За винятком таких гарантій на рівні ОС, як DEP та зашифрована пам'ять, модифікатори доступу - це лише допомога компілятора, яка допоможе вам написати кращий код. ... Правильно?
pbarranis

@pbarranis приватні поля JavaScript насправді є приватними, і немає можливості отримати доступ до них зсередини JavaScript.
Йогу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.