Estoy buscando la implementación de miembros privados en TypeScript y lo encuentro un poco confuso. Intellisense no permite acceder a miembros privados, pero en JavaScript puro, está todo ahí. Esto me hace pensar que TS no implementa a los miembros privados correctamente. ¿Alguna idea?
class Test{
private member: any = "private member";
}
alert(new Test().member);
javascript
typescript
Sean Feldman
fuente
fuente
Respuestas:
Al igual que con la verificación de tipos, la privacidad de los miembros solo se aplica dentro del compilador.
Una propiedad privada se implementa como una propiedad regular y el código fuera de la clase no puede acceder a ella.
Para hacer algo realmente privado dentro de la clase, no puede ser un miembro de la clase, sería una variable local creada dentro de un alcance de función dentro del código que crea el objeto. Eso significaría que no puede acceder a él como un miembro de la clase, es decir, usando la
this
palabra clave.fuente
this
palabra clave.JavaScript admite variables privadas.
En TypeScript esto se expresaría así:
EDITAR
Este enfoque solo debe usarse CON ESPACIO donde sea absolutamente necesario. Por ejemplo, si necesita almacenar una contraseña en caché temporalmente.
Hay costos de rendimiento para usar este patrón (irrelevante de Javascript o TypeScript) y solo debe usarse donde sea absolutamente necesario.
fuente
var _this
su uso en funciones de ámbito? ¿Por qué tendrías reparos en hacerlo en el ámbito de la clase?Una vez que el soporte para WeakMap esté más disponible, habrá una técnica interesante detallada en el ejemplo n. ° 3 aquí. .
Permite datos privados Y evita los costos de rendimiento del ejemplo de Jason Evans al permitir que los datos sean accesibles desde métodos prototipo en lugar de solo métodos de instancia.
La página vinculada MDN WeakMap enumera la compatibilidad del navegador en Chrome 36, Firefox 6.0, IE 11, Opera 23 y Safari 7.1.
fuente
protected
parámetros? : DDado que se lanzará TypeScript 3.8, podrá declarar un campo privado al que no se puede acceder o incluso detectar fuera de la clase que lo contiene .
Los campos privados comienzan con
#
carácterTenga en cuenta que estos campos privados serán diferentes a los campos marcados con
private
palabra claveÁrbitro. https://devblogs.microsoft.com/typescript/announcing-typescript-3-8-beta/
fuente
Gracias a Sean Feldman por el enlace a la discusión oficial sobre este tema; vea su respuesta para el enlace.
Leí la discusión a la que se vinculó y aquí hay un resumen de los puntos clave:
this
sin algún tipo de solución@private
minificadores que reconozcan que la anotación puede minificar eficazmente los nombres de los métodosContraargumentos generales para agregar soporte de visibilidad en el código emitido:
fuente
En TypeScript, las funciones privadas solo son accesibles dentro de la clase. Me gusta
Y mostrará un error cuando intente acceder a un miembro privado. Aquí está el ejemplo:
fuente
Me doy cuenta de que esta es una discusión anterior, pero aún podría ser útil compartir mi solución al problema de las variables y métodos supuestamente privados en una "filtración" de TypeScript hacia la interfaz pública de la clase JavaScript compilada.
Para mí, este problema es puramente cosmético, es decir, se trata del desorden visual cuando se ve una variable de instancia en DevTools. Mi solución es agrupar las declaraciones privadas dentro de otra clase que luego se instancia en la clase principal y se asigna a una
private
variable (pero aún visible públicamente en JS) con un nombre como__
(doble subrayado).Ejemplo:
Cuando la
myClass
instancia se ve en DevTools, en lugar de ver todos sus miembros "privados" entremezclados con los verdaderamente públicos (lo que puede resultar muy desordenado visualmente en el código de la vida real correctamente refactorizado), los verá agrupados ordenadamente dentro de la__
propiedad contraída :fuente
Este es un enfoque reutilizable para agregar propiedades privadas adecuadas:
Digamos que tienes una clase en
Client
algún lugar que necesita dos propiedades privadas:prop1: string
prop2: number
A continuación se muestra cómo lo implementa:
Y si todo lo que necesita es una sola propiedad privada, entonces se vuelve aún más simple, porque no necesitaría definir ninguna
ClientPrivate
en ese caso.Vale la pena señalar que, en su mayor parte, la clase
Private
solo ofrece una firma bien legible, mientras que el uso directoWeakMap
no lo hace.fuente