Si no agrego privado antes foo, loadBary text, creo que son públicos de forma predeterminada.
export class RandomComponent {
@Input() foo: string;
@Output() loadBar = new EventEmitter();
text: string;
}
¿Hay algún caso de uso cuando están publicen el componente?
Por motivos de encapsulación / seguridad, ¿debería siempre agregar privatetodos ellos como se muestra a continuación?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
Gracias
typescript
angular
Hongbo Miao
fuente
fuente

Respuestas:
Hay mucho que decir en respuesta a esta pregunta, estos son los primeros pensamientos que me vinieron a la mente:
En primer lugar, tenga en cuenta que
privatees solo una construcción en tiempo de compilación; no se puede aplicar en tiempo de ejecución (consulte aquí y aquí la discusión relevante). Como tal, desconéctate de cualquier noción deprivateser útil de alguna manera por motivos de seguridad. Simplemente no se trata de eso.Eso trata de encapsulación, y cuando tiene un campo o método en su componente que desea encapsular en él, dejando en claro que no se debe acceder a él desde ningún otro lugar, entonces debe hacerlo
private: Para esoprivatees: Señala su intención de que lo que sea que se haya puesto no debe tocarse desde fuera de la clase.Lo mismo ocurre con
public: también es una construcción solo en tiempo de compilación, por lo que el hecho de que los miembros de la clase lo seanpublicpor defecto, aunque sea cierto, tiene exactamente cero significado en tiempo de ejecución. Pero cuando tienes un miembro que explícitamente tienes la intención de exponer al mundo exterior como parte de la API de tu clase, debes hacerlopublicpara señalar esta intención: para esopublices.Todo esto es aplicable a TypeScript en general. En Angular específicamente, definitivamente hay casos de uso válidos para tener miembros públicos en clases de componentes: por ejemplo, al implementar el patrón contenedor / componente (también conocido como inteligente / tonto ), con niños "tontos" inyectando padres "inteligentes" a través de la inyección del constructor, Es extremadamente importante comunicar su intención sobre lo que los miembros del padre deben y no deben ser tocados por los niños: de lo contrario, no se sorprenda cuando encuentre a esos niños tontos jugando en el gabinete de licores de sus padres.
Entonces, mi respuesta a tu pregunta:
es un enfático no . No siempre debes agregar
privateporque al hacerlo anulas el propósito de la palabra clave, porque ya no indica ninguna intención si la pones en todas partes: es mejor que no la pongas en ninguna parte.fuente
@drewmoore proporciona una buena respuesta en el sentido de que lo privado / público se reduce a la intención. Pero hay algunas cosas más a considerar al usar valores privados inyectados:
@Import() private foo, oconstructor(private foo) {}, y solo lo usafooen su plantillafuente