TypeScript
Tutorial TypeScript: Inmutabilidad
TypeScript inmutabilidad: técnicas y ejemplos. Domina las técnicas de inmutabilidad en TypeScript con ejemplos prácticos y detallados.
Aprende TypeScript y certifícateLa inmutabilidad es un principio fundamental en programación funcional. Un objeto inmutable es un objeto cuyo estado no puede ser modificado después de que se ha creado.
Concepto de inmutabilidad
Imagínese que se tiene un objeto en código, y varias partes del programa pueden acceder y cambiar este objeto. En tal escenario, es complicado seguir la lógica del programa y predecir su comportamiento, porque el estado del objeto puede cambiar en cualquier momento desde cualquier lugar. Aquí es donde entra en juego el principio de inmutabilidad.
Cuando se trabaja con objetos inmutables, el objeto no se modifica. En su lugar, si se necesita hacer cambios, se puede crear una copia del objeto con los cambios aplicados. Esto facilita el rastreo del estado de los objetos y reduce el riesgo de efectos secundarios inesperados.
Estructuras de datos inmutables
En TypeScript, los tipos primitivos son inmutables por defecto. Estos incluyen boolean
, number
, string
, null
, undefined
y symbol
.
let a = "hola";
a = "adios"; // Esto no modifica la cadena original, sino que reasigna a a una nueva cadena
Sin embargo, los tipos de datos complejos, como los objetos y los arrays, no son inmutables.
let a = { saludo: "hola" };
a.saludo = "adios"; // Esto modifica el objeto original
Si se quiere hacer que estos tipos sean inmutables, se deben utilizar técnicas especiales.
Objetos inmutables
Se puede hacer que un objeto sea inmutable utilizando Object.freeze
.
let a = { saludo: "hola" };
Object.freeze(a);
a.saludo = "adios"; // Esto lanza un error
Se debe tener en cuenta que Object.freeze
solo es superficial, lo que significa que no hace que los objetos anidados sean inmutables.
let a = { saludo: { palabra: "hola" } };
Object.freeze(a);
a.saludo.palabra = "adios"; // Esto no lanza un error
En el ejemplo anterior, se ha hecho Object.freeze
de a
, pero no de a.saludo
, de forma que no se podría modificar el primero pero sí el segundo.
Arrays inmutables
Pueden tratarse a los arrays como inmutables utilizando métodos que no modifican el array original, sino que devuelven un nuevo array con los cambios aplicados. Estos métodos incluyen map
, filter
, slice
, concat
, etc. Por ejemplo, el método map
devuelve un nuevo array al que se le aplica una transformación, pero sin modificar el array original.
let a = [1, 2, 3];
let b = a.map(x => x * 2);
// b es [2, 4, 6], a todavía es [1, 2, 3]
Readonly en TypeScript
TypeScript proporciona una manera de asegurar que una variable no se modifique: el modificador readonly
.
interface Persona {
readonly nombre: string;
readonly edad: number;
}
let persona: Persona = { nombre: "Juan", edad: 30 };
persona.nombre = "Pedro"; // Esto arroja un error
En este ejemplo, nombre
y edad
son solo de lectura, por lo que no pueden ser modificados después de la asignación inicial.
En resumen, la inmutabilidad es un principio poderoso que puede hacer que el código sea más predecible y más fácil de entender. En TypeScript, se pueden usar varias técnicas para asegurar la inmutabilidad, incluyendo Object.freeze
, métodos inmutables de arrays y el modificador readonly
.
Otros ejercicios de programación de TypeScript
Evalúa tus conocimientos de esta lección Inmutabilidad con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Funciones
Reto composición de funciones
Reto tipos especiales
Reto tipos genéricos
Módulos
Polimorfismo
Funciones TypeScript
Interfaces
Funciones puras
Reto namespaces
Funciones flecha
Polimorfismo
Operadores
Conversor de unidades
Funciones flecha
Control de flujo
Herencia
Clases
Proyecto validación de tipado
Clases y objetos
Encapsulación
Herencia
Proyecto sistema de votación
Reto genéricos con clases
Inmutabilidad
Interfaces
Funciones de alto orden
Reto map y filter
Control de flujo
Interfaces
Reto funciones orden superior
Herencia y clases abstractas
Reto tipos mapped
Herencia de clases
Reto funciones puras
Variables y constantes
Introducción a TypeScript
Reto testing unitario
Funciones de primera clase
Clases
OOP y CRUD en TypeScript
Interfaces y su implementación
Tipos genéricos
Namespaces
Operadores y expresiones
Proyecto generador de contraseñas
Reto unión e intersección
Encapsulación
Tipos de unión e intersección
Tipos de unión e intersección
Reto hola mundo en TS
Variables y constantes
Funciones puras
Control de flujo
Introducción a TypeScript
Resolución de módulos
Control de flujo
Reto tipos de utilidad
Reto tipos literales y condicionales
Reto exportar e importar
Propiedades y métodos
Tipos de utilidad
Clases y objetos
Tipos de datos, variables y constantes
Proyecto Minigestor de tareas
Operadores
Funciones flecha y contexto
Proyecto Inventario de productos
Funciones
Reto type aliases
Funciones de alto orden
Funciones y parámetros tipados
Tipos literales
Reto enums
Tipos de utilidad
Modificadores de acceso y encapsulación
Polimorfismo
Tipos genéricos
Reto módulos
Tipos literales
Inmutabilidad
Proyecto Generator de datos
Variables y constantes
Funciones de primera clase
Todas las lecciones de TypeScript
Accede a todas las lecciones de TypeScript y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Typescript
Introducción Y Entorno
Instalación Y Configuración De Typescript
Introducción Y Entorno
Tipos De Datos, Variables Y Constantes
Sintaxis
Operadores Y Expresiones
Sintaxis
Control De Flujo
Sintaxis
Funciones Y Parámetros Tipados
Sintaxis
Funciones Flecha Y Contexto
Sintaxis
Enums
Sintaxis
Type Aliases Y Aserciones De Tipo
Sintaxis
Clases Y Objetos
Programación Orientada A Objetos
Interfaces Y Su Implementación
Programación Orientada A Objetos
Modificadores De Acceso Y Encapsulación
Programación Orientada A Objetos
Herencia Y Clases Abstractas
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Decoradores Básicos
Programación Orientada A Objetos
Propiedades Y Métodos
Programación Orientada A Objetos
Inmutabilidad
Programación Funcional
Funciones Puras Y Efectos Secundarios
Programación Funcional
Funciones De Primera Clase
Programación Funcional
Funciones De Alto Orden
Programación Funcional
Conceptos Básicos E Inmutabilidad
Programación Funcional
Funciones De Primera Clase Y Orden Superior
Programación Funcional
Composición De Funciones
Programación Funcional
Métodos Funcionales De Arrays (Map, Filter, Reduce)
Programación Funcional
Tipos Literales Y Tipos Condicionales
Tipos Intermedios Y Avanzados
Tipos Genéricos Básicos
Tipos Intermedios Y Avanzados
Tipos De Unión E Intersección
Tipos Intermedios Y Avanzados
Tipos De Utilidad (Partial, Required, Pick, Etc)
Tipos Intermedios Y Avanzados
Unknown, Never Y Tipos Especiales
Tipos Intermedios Y Avanzados
Tipos Mapped
Tipos Intermedios Y Avanzados
Genéricos Con Clases E Interfaces
Tipos Intermedios Y Avanzados
Módulos
Namespaces Y Módulos
Namespaces
Namespaces Y Módulos
Resolución De Módulos
Namespaces Y Módulos
Exportación E Importación De Módulos
Namespaces Y Módulos
Introducción A Módulos
Namespaces Y Módulos
Testing Unitario En Typescript
Testing
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender el concepto de inmutabilidad y su importancia en programación funcional.
- Conocer las ventajas de trabajar con objetos inmutables para facilitar el rastreo del estado de los objetos y reducir los efectos secundarios inesperados.
- Aprender a hacer objetos inmutables utilizando
Object.freeze
. - Entender cómo los métodos inmutables de arrays, como
map
,filter
,slice
yconcat
, permiten trabajar con arrays sin modificar el array original. - Saber cómo utilizar el modificador
readonly
en TypeScript para asegurar que una variable no se modifique después de su asignación inicial.