"Privado" y "público" en el componente angular

120

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

Hongbo Miao
fuente
Para ser simple, una función privada solo se puede usar en el componente. No es posible acceder a una función privada desde otro componente. Supongamos que en servicio, si una función se declara como Privada, no se puede acceder a ella desde ningún otro componente.
Kevin

Respuestas:

202

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 de privateser ú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 eso privatees: 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 sean publicpor 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 hacerlo publicpara señalar esta intención: para eso publices.

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:

¿Debo siempre agregar privado para todos ellos como a continuación?

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.

Dibujó Moore
fuente
5
Gracias por la explicación. Pero tal vez me equivoque: entiendo que la mayoría de las veces las propiedades y los métodos tienen que ser privados (= "para uso exclusivo de este componente"). Entonces la respuesta debería ser "SÍ por defecto, siempre que el tipo no necesite exponer la propiedad / método al exterior". No ? ¿Por qué concluir su explicación respondiendo "no" (que suena como un "nunca")?
M'sieur Toph '21 de
1
Recurrí a los tutoriales de Angular 2 y no supe cuándo debería usar public. Hay muchas variantes para la comunicación de componentes: angular.io/docs/ts/latest/cookbook/… Probablemente deberíamos usar public solo para propiedades y métodos definidos a través de Input Output. Pero no estoy seguro.
Ruslan Borovok
Por lo general, tengo que usar 'público' cuando declaro una propiedad en el constructor que no se usa dentro de la clase, pero se usa afuera (es decir, dentro de una plantilla u otro componente).
tuliomarchetto
18

@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:

Si queremos emitir TypeScript como salida del proceso de compilación de AoT debemos asegurarnos de acceder solo a campos públicos en las plantillas de nuestros componentes **

Lucas
fuente
re su primer punto: Esos errores no tienen nada que ver con que un miembro sea público o privado, simplemente indican que uno no se usa. Sus dos segundos puntos serían válidos si la pregunta fuera sobre hacer referencia a miembros privados en plantillas , pero no lo es. Vea aquí una pregunta que es
drew moore
@drewmoore, tienes razón y entiendo que indican que no se utilizan. Sin embargo, las variables públicas pueden usarse externamente, por lo que nunca activarían esa advertencia. En cuanto a las preguntas en sí "¿Hay algún caso de uso cuando son públicos en el componente?", Creo que mi segundo y tercer punto al menos indican un caso de uso cuando son públicos , específicamente, cuando quieres usarlos en la plantilla. (como se indica en el texto citado).
Lucas