Getters y Setters en TypeScript: análisis completo con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Get y Set en TypeScript: la magia de los accesores sin dolor

\n\n

¿Alguna vez has escrito una clase en TypeScript y has pensado: «Ojalá pudiera hacer que una propiedad sea inteligente, que al leerla calcule algo y al asignarla valide los datos»? Conoce los getters (get) y setters (set). No son solo azúcar sintáctico, sino una herramienta poderosa para controlar el acceso a los datos.

\n\n

Si ya te has topado con este tema en Stack Overflow, sabrás que la pregunta «get and set in TypeScript» acumula miles de visitas. La gente se confunde sobre cuándo usar accesores y cuándo usar métodos normales. En este artículo lo desglosaremos todo: desde lo básico hasta los detalles más complejos.

\n\n

¿Listo? ¡Vamos allá!

\n\n

¿Qué son get y set en TypeScript?

\n\n

Un getter es un método que se invoca al leer una propiedad. Un setter es un método que se invoca al asignar un valor. Juntos forman los accesores (accessors). Parece que estás trabajando con un campo normal, pero debajo del capó hay lógica.

\n\n

Aquí tienes un ejemplo mínimo:

\n\n
class User {\n  private _name: string = '';\n\n  get name(): string {\n    return this._name;\n  }\n\n  set name(value: string) {\n    if (value.length > 0) {\n      this._name = value;\n    } else {\n      console.log('El nombre no puede estar vacío');\n    }\n  }\n}\n\nconst user = new User();\nuser.name = 'Ana'; // se llama al set\nconsole.log(user.name); // se llama al get → 'Ana'\nuser.name = ''; // intento de asignar nombre vacío → mensaje en consola
\n\n

Observa: la propiedad _name con el prefijo _ es un campo privado. No se puede acceder directamente desde fuera. En su lugar, usamos el accesor público name.

\n\n

¿Para qué sirven los getters y setters? 3 razones principales

\n\n

1. Validación de datos

\n

El setter es el lugar ideal para verificar los valores de entrada. Puedes rechazar datos incorrectos antes de que lleguen al objeto.

\n\n
class Temperature {\n  private _celsius: number = 0;\n\n  get celsius(): number {\n    return this._celsius;\n  }\n\n  set celsius(value: number) {\n    if (value < -273.15) {\n      throw new Error('La temperatura no puede estar por debajo del cero absoluto');\n    }\n    this._celsius = value;\n  }\n}
\n\n

2. Propiedades calculadas

\n

Un getter puede devolver no un valor almacenado, sino el resultado de un cálculo basado en otros datos.

\n\n
class Rectangle {\n  constructor(public width: number, public height: number) {}\n\n  get area(): number {\n    return this.width * this.height;\n  }\n\n  get perimeter(): number {\n    return 2 * (this.width + this.height);\n  }\n}\n\nconst rect = new Rectangle(10, 5);\nconsole.log(rect.area); // 50 — se calcula sobre la marcha
\n\n

3. Encapsulación y control de acceso

\n

Puedes hacer que una propiedad sea solo de lectura (solo getter) o solo de escritura (solo setter). Esto ayuda a cumplir los principios de la POO.

\n\n
class Config {\n  private _apiKey: string = 'secret123';\n\n  get apiKey(): string {\n    // Se puede añadir registro o verificación de permisos\n    return this._apiKey;\n  }\n  // El setter no está definido — propiedad solo de lectura\n}\n\nconst config = new Config();\nconsole.log(config.apiKey); // 'secret123'\n// config.apiKey = 'newKey'; // ¡Error de compilación!
\n\n

Preguntas frecuentes sobre get y set en TypeScript

\n\n

Analicemos lo que los principiantes (y no tan principiantes) preguntan más a menudo en Stack Overflow y foros.

\n\n

Pregunta 1: ¿En qué se diferencian get/set de los métodos normales?

\n

La principal diferencia es la sintaxis de llamada. Los accesores se ven como propiedades: sin paréntesis. Esto hace que el código sea más limpio e intuitivo. Compara:

\n\n
// Con métodos\nuser.getName();\nuser.setName('Pedro');\n\n// Con accesores\nuser.name;\nuser.name = 'Pedro';
\n\n

La segunda diferencia es que los accesores no se pueden sobrecargar (overload). Cada accesor tiene una sola signatura

Blogs

Book Recommendations