Un Union Type, o tipo unión, es un tipo de dato compuesto que especifica que un valor puede ser de cualquiera de varios tipos posibles, pero en un momento dado, solo puede ser de uno de ellos. A diferencia de los 'sum types' más generales (como los 'tagged unions' o 'algebraic data types' en lenguajes funcionales), un Union Type simple no siempre incluye un 'tag' explícito para indicar qué tipo está activo, aunque en sistemas de tipos más avanzados, esta información es implícita o se infiere. Su propósito principal es permitir la representación de datos que pueden variar en su estructura o naturaleza, manteniendo al mismo tiempo una fuerte verificación de tipos en tiempo de compilación o ejecución.

Los Union Types se implementan en una variedad de contextos. En TypeScript, se utilizan ampliamente para combinar tipos (ej. `string | number | boolean`), permitiendo que una variable acepte cualquiera de esos tipos. En lenguajes como C/C++, las 'unions' permiten que diferentes miembros compartan la misma ubicación de memoria, aunque el programador es responsable de saber qué miembro está activo. GraphQL utiliza Union Types para devolver uno de varios tipos de objetos posibles de un campo. Protocol Buffers y Apache Avro también soportan Union Types para definir esquemas de datos flexibles donde un campo puede contener diferentes tipos de mensajes o primitivas.

Para un arquitecto de sistemas, los Union Types son cruciales para diseñar APIs robustas y esquemas de datos flexibles. Permiten modelar escenarios donde la respuesta de un servicio o la estructura de un mensaje puede variar según el contexto, sin recurrir a tipos 'any' o 'object' que debilitan la seguridad de tipo. Al usar Union Types, se mejora la legibilidad del código, se reduce la probabilidad de errores en tiempo de ejecución y se facilita la evolución de los sistemas. Sin embargo, su uso requiere una gestión cuidadosa de la lógica de 'narrowing' (discriminación de tipos) para manejar cada caso posible, lo que puede añadir complejidad si la unión es muy grande o si los tipos no son claramente distinguibles. La elección de usar Union Types frente a interfaces o herencia depende de si los tipos alternativos representan 'uno de muchos' (unión) o 'un tipo con múltiples implementaciones' (polimorfismo).