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\nSi 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\nUn 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\nAquí tienes un ejemplo mínimo:
\n\nclass 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\nObserva: 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.
¿Para qué sirven los getters y setters? 3 razones principales
\n\n1. Validación de datos
\nEl setter es el lugar ideal para verificar los valores de entrada. Puedes rechazar datos incorrectos antes de que lleguen al objeto.
\n\nclass 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\n2. Propiedades calculadas
\nUn getter puede devolver no un valor almacenado, sino el resultado de un cálculo basado en otros datos.
\n\nclass 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\n3. Encapsulación y control de acceso
\nPuedes 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\nclass 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\nPreguntas frecuentes sobre get y set en TypeScript
\n\nAnalicemos lo que los principiantes (y no tan principiantes) preguntan más a menudo en Stack Overflow y foros.
\n\nPregunta 1: ¿En qué se diferencian get/set de los métodos normales?
\nLa 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\nLa segunda diferencia es que los accesores no se pueden sobrecargar (overload). Cada accesor tiene una sola signatura