typescript - versiones - "Privado" y "público" en componente angular
install angular (2)
@drewmoore proporciona una buena respuesta en que lo privado / público se reduce a la intención. Pero hay algunas cosas más a tener en cuenta al usar valores privados inyectados:
-
Tanto el mecanografiado (
noUnusedLocals
) como tslint (
no-unused-variable
unused
no-unused-variable
) informarán errores si usa
@Import() private foo
, oconstructor(private foo) {}
, y solo usafoo
en su plantilla - AOT no funcionará :
Si queremos emitir TypeScript como salida del proceso de compilación de AoT, debemos asegurarnos de que accedemos solo a los campos públicos en las plantillas de nuestros componentes **
Si no agrego
privado
antes de
foo
,
loadBar
y
text
, creo que son
públicos
por defecto.
export class RandomComponent {
@Input() foo: string;
@Output() loadBar = new EventEmitter();
text: string;
}
¿Hay algún caso de uso cuando son
public
en el componente?
Por razones de encapsulación / seguridad, ¿debería agregar siempre
private
para todos ellos como a continuación?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
Gracias
Hay mucho que decir en respuesta a esta pregunta, estos son los primeros pensamientos que saltaron a mi mente:
En primer lugar, tenga en cuenta que lo
private
es solo una construcción en tiempo de compilación: no se puede aplicar en tiempo de ejecución (consulte
here
y
here
para una discusión relevante).
Como tal, por favor, desactívese de cualquier noción de ser
private
útil de alguna manera por razones de seguridad.
Eso simplemente no es de lo que se trata.
Se
trata
de la encapsulación, y cuando tiene un campo o método en su componente que desea encapsular en él, dejando en claro que no debe accederse desde ningún otro lugar, entonces debe hacerlo
private
: eso es lo
private
para:
Indica tu intención de
que lo que sea que te hayas puesto no se debe tocar desde fuera de la clase.
Lo mismo ocurre con el
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 sean
public
por defecto, si bien es cierto, tiene exactamente cero significado en tiempo de ejecución.
Pero cuando tiene un miembro que tiene la intención explícita de exponer al mundo exterior como parte de la API de su clase, debe hacerlo
public
para indicar esta intención: para eso es
public
.
Todo esto es aplicable a Typecript en general. En Angular específicamente, existen casos de uso definitivamente válidos para tener miembros públicos en clases de componentes: por ejemplo, al implementar el patrón container/component (también conocido como smart/dumb ), con niños "tontos" inyectando padres "inteligentes" mediante inyección de constructor, Es extremadamente importante comunicar su intención sobre lo que los miembros de los padres deben y no deben tocar los niños: de lo contrario, no se sorprenda cuando vea a esos niños tontos jugando en el gabinete de licores de sus padres.
Entonces, mi respuesta a tu pregunta:
¿Debo agregar siempre privado para todos ellos como a continuación?
es un enfático
no
.
No
siempre
debe agregar
private
porque al hacerlo no cumple con el propósito de la palabra clave, porque ya no indica ninguna intención si la coloca en todas partes: es mejor que no la coloque en ninguna parte.