El sistema de tipos de TypeScript destaca por su capacidad para definir uniones de tipos y tipos literales, lo que permite una precisión en la definición de APIs sin sacrificar la concisión. En contraste, Haskell carece de estas características nativas, lo que obliga a los desarrolladores a utilizar extensiones del lenguaje para replicar un comportamiento similar. El artículo explora dos alternativas principales para lograr esto: el uso de GADTs (Generalized Algebraic Data Types) con DataKinds y el uso de tipos de suma desempaquetados (unboxed sums) mediante UnboxedSums.
La primera alternativa emplea la sintaxis de Here y There para construir tipos a nivel de tipo, aunque presenta limitaciones semánticas, como la imposibilidad de normalizar duplicados. La segunda opción ofrece una sintaxis más plana y legible, utilizando la notación (# | #) para definir uniones. Sin embargo, esta segunda alternativa enfrenta desafíos técnicos significativos, ya que los tipos de suma desempaquetados tienen un tipo (kind) diferente según su aridad, lo que impide su uso directo en declaraciones de familias de tipos con parámetros variables. Además, ninguna de las dos soluciones logra la semántica exacta de una unión de tipos como un conjunto, ya que no normalizan automáticamente los duplicados. Para resolver esto, se menciona el uso de conjuntos a nivel de tipo, aunque esto añade complejidad adicional a la representación. Este análisis técnico sirve como referencia para programadores que buscan mapear conceptos de TypeScript a Haskell, destacando las diferencias fundamentales en la sintaxis y el comportamiento de los tipos entre ambos lenguajes.
