Uniones Discriminadas en TypeScript
En TypeScript, las “Discriminated Unions” (uniones discriminadas) son una característica poderosa que permite crear tipos de unión con propiedades comunes llamadas discriminantes. Estas discriminantes ayudan a TypeScript a determinar el tipo exacto de un objeto dentro de la unión.
¿Qué son las Uniones Discriminadas?
Las Uniones Discriminadas son un concepto en TypeScript que permite crear tipos de unión (union types) donde cada tipo en la unión tiene una propiedad común conocida como discriminante. La discriminante es una propiedad que tiene un valor específico para cada tipo en la unión. TypeScript utiliza esta propiedad para determinar el tipo exacto de un objeto en tiempo de compilación.
¿Para qué sirven?
Las Uniones Discriminadas son útiles para modelar estructuras de datos que pueden tener diferentes formas o variantes, en las que cada variante se caracteriza por una propiedad que la diferencia de las demás. Algunos usos comunes de las Uniones Discriminadas incluyen:
-
Manejo de datos variados: Las Uniones Discriminadas se pueden emplear para gestionar datos de diversos tipos, como las respuestas de API que pueden incluir tanto éxitos como errores
-
Componentes reutilizables: Al crear componentes o funciones genéricas, las Uniones Discriminadas te permiten adaptar su comportamiento a diferentes situaciones sin duplicar código.
-
Validación de formularios: En aplicaciones web, las Uniones Discriminadas son útiles para manejar la validación de formularios, donde diferentes campos pueden requerir diferentes validaciones según el tipo de dato.
Ventajas
-
Seguridad de tipos: TypeScript puede realizar comprobaciones de tipos en tiempo de compilación, para garantizar que solo se acceda a las propiedades válidas de un objeto en una unión.
-
Mejora la legibilidad: Las Uniones Discriminadas hacen que el código sea más legible al indicar de manera explícita las diferentes variantes que pueden tomar los datos.
-
Facilita el mantenimiento: Cuando necesitas agregar nuevas variantes, las Uniones Discriminadas te obligan a actualizar todos los lugares donde se utilizan, lo que facilita el mantenimiento y la detección temprana de errores.
Desventajas
-
Aumento de la complejidad: En casos donde tienes muchas variantes, las Uniones Discriminadas pueden aumentar la complejidad del código debido a la necesidad de administrar múltiples casos.
-
Mayor tipeo: A veces, la necesidad de especificar propiedades discriminantes y tipos puede hacer que el código sea más largo y verboso.
Ejemplo práctico
interface SuccessResponse { status: "success"; message: string;}
interface ErrorResponse { status: "error"; error: string;}
type ApiResponse = SuccessResponse | ErrorResponse;
const handleResponse = (response: ApiResponse) => { switch (response.status) { case "success": console.log("Éxito:", response.message); break; case "error": console.error("Error:", response.error); break; }};En este ejemplo, ApiResponse es una unión discriminante que puede representar respuestas exitosas y erróneas. La propiedad status actúa como la discriminante y determina el tipo exacto de respuesta. Esto garantiza que el código de handleResponse pueda manejar cada caso de manera segura.
Páginas para visitar
- Discriminated Unions, documentación oficial de typescript.
- Discriminated Unions, más ejemplos prácticos.