¿Qué modificadores de acceso están implícitos cuando no se especifican?

138

Para todos los diferentes conceptos que admiten modificadores de acceso, como campos, propiedades, métodos y clases, ¿qué modificadores de acceso están implícitos si no se especifican?

Sam
fuente
@basarat, ha pasado mucho tiempo desde que usé TypeScript, ¡así que es difícil recordar cómo funciona en estos días! Hasta donde recuerdo, su respuesta parecía razonable, pero no sentí que fuera lo suficientemente autorizada para que la marcara como correcta. ¿Su respuesta se basa en su experiencia con el idioma, o es de información en las especificaciones?
Sam
basado en la especificación github.com/Microsoft/TypeScript/blob/master/doc/spec.md
basarat
1
Para aclarar esta pregunta y respuesta, el mecanografiado debería haberse especificado en la pregunta para que quede claro. Hay una etiqueta mecanografiada, pero esa es la única indicación de que no estamos discutiendo scala, java, C #, C ++, ....
absmiths

Respuestas:

216

Todo en un classes publicsi no se especifica. Todo en un modulees privado a menos que exportse use una palabra clave.

basarat
fuente
66
Para personas que juegan con un kit de inicio. Algunos de ellos se envían con tslint y puede ser muy confuso. Cuando vea este mensaje, default access modifier on member/method not allowed marque tslint.jsonpara permitir el modificador de acceso implícito o predeterminado.
visheshd
1
¿Sería posible utilizar un paso previo a la transpilación para asignar automáticamente private?
Qwerty
-4

No estoy de acuerdo que

Todo en una clase es público si no se especifica.

Todo es público, incluso si se usa privado. Solo mira el código transpilado. Los métodos privados anotados estarán disponibles al público. Solo la transpiración arrojará errores. Tanto públicos como privados se convertirán a<Object>.prototype.funcName

Jens Peters
fuente
24
Sí, este es un buen punto. Sin embargo, mi pregunta era which access modifiers are implied when not specifiedmás que can my code be accessed when an access modifier is not specified. Los modificadores de acceso son un concepto de TypeScript en lugar de un concepto de JavaScript. Entonces, creo que la respuesta de @basarat abordó lo que quise decir en la pregunta y parece ser correcta en el contexto de la pregunta. Quizás haya espacio para desambiguar la redacción de la pregunta y la respuesta.
Sam
Así es como funciona TS, compilará su código sin importar si es "correcto" desde el punto de vista de TS, esto implica todo en TS sin excepción de las clases, pero el punto principal es si respeta las advertencias de TS: no lo hará estar accediendo a propiedades marcadas como privadas.
Andrew Bogdanov
3
No puedo pensar en ningún idioma donde algo sea realmente privado. En C # puede acceder fácilmente a cualquier campo privado a través de la reflexión. En lenguajes de nivel inferior como C o C ++, puede acceder a campos privados simplemente moviendo punteros. A falta de las salvaguardas a nivel del sistema operativo, como DEP y memoria encriptada, los modificadores de acceso son solo asistencia proporcionada por el compilador para ayudarlo a escribir un mejor código. ...¿Correcto?
pbarranis
Los campos JavaScript privados de @pbarranis son realmente privados y no hay forma de acceder a ellos desde el tiempo de ejecución de JavaScript.
Yogu