Uniones TypeScript y Operadores a Nivel de Bits: Mi Experimento Fallido Favorito

Uniones TypeScript y Operadores a Nivel de Bits: Mi Experimento Fallido Favorito
JavaScript y TypeScript comparten símbolos que suenan parecido pero hacen cosas distintas. La barra vertical | en TypeScript significa unión de tipos: por ejemplo un ID puede ser string | number, es decir puede ser una cosa u otra. En JavaScript, la misma barra actúa a nivel de bits y combina banderas: 1 | 2 resulta en 3 porque se mira bit a bit y si alguno tiene el bit puesto, el resultado lo tendrá también. Dos mundos, el mismo símbolo, y una idea curiosa surgió de esa rima visual: intentar replicar la sintaxis de TypeScript en tiempo de ejecución usando operaciones a nivel de bits.
La limitación inicial son los números de JavaScript, que ofrecen solo 53 bits seguros, como un panel de interruptores con 53 botones. Para convertir esa idea en algo escalable usamos BigInt, que no tiene ese techo y permite imaginar un tablero infinito de interruptores. Cada validador obtiene su propio bit en un skyline potencialmente infinito, lo que abre la puerta a combinar validadores mediante OR y comprobar pertenencia con AND.
La técnica clave es asignar a cada validador una potencia de dos distinta. Empezando con 1n y desplazando hacia la izquierda repetidamente se generan banderas como 1n, 2n, 4n, 8n, 16n y así sucesivamente, de forma que cada bandera tiene exactamente un bit activo y nunca colisionan entre validadores. Con esas banderas en un mapa que relaciona cada bit con una función validadora, combinarlas y probarlas es tan sencillo como operar con OR y AND a nivel de bits.
Para evitar escribir manualmente las potencias de dos se puede crear un helper getNextFlag que devuelva la siguiente bandera disponible multiplicando por dos la última. Con eso el código de registro de validadores queda limpio y legible, cada nueva bandera es solo la siguiente potencia de dos y el mapa mantiene la relación entre máscara y función validadora.
Lo más bonito vino con Proxy. Interceptando accesos a propiedades se puede fabricar una API que se parezca a TypeScript en tiempo de ejecución: Type.string, Type.number, Type.array retornan banderas BigInt que además registran la función validadora adecuada. Así escribir Type.string | Type.number produce una máscara combinada que se comporta exactamente como una unión en tiempo de ejecución, y el código llega a lucir como si el lenguaje tuviera inferencia dinámica de tipos.
La realidad, sin embargo, fue menos amable. El compilador de TypeScript no puede ver dentro de esas máscaras BigInt: para el sistema de tipos todo sigue siendo un número opaco, sin información inferible. Sin poder inferir ni estrechar tipos, se pierde la mayor parte de la ergonomía que se buscaba. La ilusión de un TypeScript dinámico se rompe porque el tipado estático no se beneficia de los trucos en tiempo de ejecución.
Hay alternativas y bibliotecas maduras que hacen esto de forma práctica y con inferencia integrada, por ejemplo bibliotecas de validación que aportan tipos y ayuda del compilador por una sintaxis ligeramente diferente. En mi caso la herramienta Pipetype fue el experimento: una mezcla de uniones y máscaras de bits, Proxy y BigInt que resultó ser una curiosidad educativa más que una solución productiva.
Aun así, el experimento enseñó mucho. Mostró cuánto puede estirarse un solo símbolo, cómo BigInt redefine las posibilidades y cómo los Proxy pueden disfrazar API con azúcar sintáctica. Y también recordó un límite importante: la separación entre lo que ocurre en tiempo de ejecución y lo que el compilador puede razonar. A veces los mejores experimentos son los que fallan, porque ponen de manifiesto hasta dónde llegan las ideas y dónde aparecen las barreras.
En Q2BSTUDIO aplicamos aprendizajes como este cuando diseñamos soluciones a medida. Somos una empresa de desarrollo de software y aplicaciones a medida especializada en inteligencia artificial, ciberseguridad y servicios cloud aws y azure. Si necesitas desarrollar una solución a tu medida puedes ver nuestras opciones de desarrollo de aplicaciones y software a medida y también ofrecemos servicios avanzados de soluciones de inteligencia artificial para empresas que incluyen agentes IA, automatización y asesoría para integrar IA para empresas en procesos existentes.
Trabajamos además en áreas complementarias como ciberseguridad, pentesting y servicios de inteligencia de negocio para que las soluciones no solo funcionen sino que lo hagan de forma segura y con información accionable. Palabras clave que nos definen incluyen aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA y power bi, y forman parte de la oferta con la que ayudamos a transformar ideas en productos reales y escalables.
Si te interesa una consultoría técnica o explorar opciones para integrar validación avanzada, inferencia de tipos o agentes IA en tu producto, en Q2BSTUDIO combinamos experimentación y experiencia para entregar soluciones fiables y orientadas al negocio.
Conclusión El experimento con uniones simuladas por máscaras de bits y BigInt fue una lección valiosa: técnicamente fascinante, pedagógicamente útil y finalmente incompatible con las expectativas de tipado de TypeScript. Aun así, la experiencia nutre mejores decisiones a la hora de elegir tecnologías y librerías en proyectos reales, algo que aplicamos día a día en nuestros desarrollos de software a medida y servicios tecnológicos.
Comentarios