Si no agrego privado antes foo
, loadBar
y 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 public
en el componente?
Por motivos de encapsulación / seguridad, ¿debería siempre agregar private
todos 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
private
es 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 deprivate
ser ú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 esoprivate
es: 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 seanpublic
por 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 hacerlopublic
para señalar esta intención: para esopublic
es.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
private
porque 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 usafoo
en su plantillafuente