Clases en TypeScript: quién accede a cada miembro

Clases en TypeScript

Clases en TypeScript: modificadores, readonly, abstract, implements | We.Inc

Campos, constructores, parameter properties, public, protected, private y #private, readonly, abstract e implements. Comprueba quién llega a cada miembro en una matriz en vivo.

Una clase de TypeScript es una clase de JavaScript con campos tipados y reglas de acceso. Los miembros public son accesibles desde cualquier sitio, los protected dentro de la clase y sus subclases, y los private solo dentro de la clase. Esas tres comprobaciones existen solo en tiempo de compilación. Un campo #name es privado también en el JavaScript que se ejecuta, y readonly bloquea las escrituras después del constructor.

Palabras clave de clase y lo que hacen

Elige un modificador y la matriz muestra cinco formas en que el código podría llegar a ese miembro, con el resultado de tsc para cada una. La fila de corchetes es la que sorprende: los modificadores de tiempo de compilación se pueden esquivar con una clave de texto, mientras que un campo # no.

Preguntas frecuentes

¿Qué diferencia hay entre private y #private?

private es una comprobación de TypeScript. Desaparece de la salida, y obj["secret"] sigue compilando y lee el valor. Un campo #secret es un campo privado de JavaScript: no hay ninguna clave de texto que llegue a él, y el código de fuera de la clase no puede leerlo en tiempo de ejecución.

¿Qué son las parameter properties?

Un atajo que declara y asigna un campo a partir de un parámetro del constructor. Escribir constructor(private readonly id: string) {} crea un campo id private readonly sin necesidad de cuerpo. El prefijo puede ser public, protected, private o readonly.

¿implements cambia los tipos dentro de mi clase?

No. implements solo comprueba que la clase terminada encaja con la interfaz. Los parámetros de los métodos siguen necesitando sus propias anotaciones; si omites una en modo strict, obtienes un error de any implícito, aunque la interfaz ya indique su tipo.

¿Por qué TypeScript dice que una propiedad no tiene inicializador?

strictPropertyInitialization, que strict activa, exige que cada campo declarado tenga valor en la declaración o en el constructor. Dale un valor, hazlo opcional o añade ! después del nombre si otra cosa lo asigna antes de usarlo.

¿Cuándo debo usar una clase abstracta en lugar de una interfaz?

Usa una clase abstracta cuando las subclases deban compartir código real, como un método que invoca un hook abstracto. Una interfaz no lleva código y una clase puede implementar varias, así que sirve para describir formas.

Campos, constructores y parameter properties

Privacidad en compilación frente a privacidad en ejecución

Clases e interfaces trabajan juntas

Patrones de clase en la práctica

Parameter properties y un campo #

El constructor declara dos campos en su lista de parámetros. La caché es un campo #, así que nada fuera de la clase puede leerla ni vaciarla.

Una base abstracta con un override

describe es código compartido; area es el hook que cada figura debe aportar. Con noImplicitOverride activado, la palabra override es obligatoria en area dentro de Circle.

implements comprueba, no infiere

La interfaz asegura que la clase tiene send con la forma correcta, pero el parámetro sigue necesitando su propia anotación de tipo.

Sin restricciones. Omitir el modificador significa lo mismo.

Dentro de los métodos de Account

Dentro de un método de Savings

Desde fuera, con un punto

Desde fuera, con una clave de texto

Desde fuera, asignando un valor nuevo

Abierto a la clase y a sus subclases. Una clave de texto sigue saltándose la comprobación, porque es solo una regla de tipos.

Dentro de los métodos de Account

Dentro de un método de Savings

Desde fuera, con un punto

Desde fuera, con una clave de texto

Desde fuera, asignando un valor nuevo

Cerrado incluso para las subclases, pero solo durante la comprobación de tipos. La forma con corchetes compila y el valor se puede leer en tiempo de ejecución.

Dentro de los métodos de Account

Dentro de un método de Savings

Desde fuera, con un punto

Desde fuera, con una clave de texto

Desde fuera, asignando un valor nuevo

Un campo privado de JavaScript. Ninguna clave de texto lo nombra, así que todas las rutas externas fallan, y el motor impone la misma regla en tiempo de ejecución.

Dentro de los métodos de Account

Dentro de un método de Savings

Desde fuera, con un punto

Desde fuera, con una clave de texto

Desde fuera, asignando un valor nuevo

Cualquiera puede leerlo; nadie puede asignarlo después de la construcción, ni siquiera los propios métodos de la clase.

Dentro de los métodos de Account

Dentro de un método de Savings

Desde fuera, con un punto

Desde fuera, con una clave de texto

Desde fuera, asignando un valor nuevo

Matriz de acceso a miembros

Elige un modificador

Acceso a un miembro {v}

Usado desde

Código

Resultado de tsc

Compila

Empieza gratis · Sin tarjeta de crédito

Relacionado: Guías

Producto

Para quién es

Funciones

Recursos

Empresa

Mapa del sitio