Hay mucha belleza en tener la oportunidad de trabajar con este tipo de tipos. En general, encontrar la representación más simple posible que permita componer tipos juntos, compararlos entre sí y reducirlos completamente fue realmente un problema increíble en el que trabajar, y condujo a muchas capacidades nuevas y significativas dentro de la validación también.
Al tener esta información de tipo, por ejemplo, podemos hacer cosas como discriminar uniones automáticamente. Entonces, por ejemplo, en Archetype, puedes definir una unión directamente de esta manera, y básicamente identificaremos dentro de nuestro sistema de tipos el discriminante óptimo, o conjunto de discriminantes, en caso de que requiera múltiples comprobaciones para determinar en qué rama te encuentras, y optimizaremos implícitamente el proceso de validación en tiempo de ejecución aprovechando esas comprobaciones para que la mayoría de las uniones se verifiquen en tiempo constante, sin que ni siquiera tengas que pensarlo, mientras que otros validadores existentes sin esa información del sistema de tipos simplemente lo verificarán de forma lineal o requerirán que optes por especificarlo manualmente a través de una sintaxis como esta. Zod, creo que en realidad recientemente estaba teniendo algunos problemas para mantener sus tipos de unión discriminados y, incluso al definirlo explícitamente, es realmente costoso a nivel de tipo. Puedes ver que hay una gran disparidad de aproximadamente 20 veces menos instancias para la unión aquí, y por supuesto, también es un tipo mucho más sencillo de definir y leer. Pasas el ratón por encima, ves exactamente cuál es la unión, mientras que aquí, quiero decir, no uso constantemente Zod, pero es mucho más difícil saber qué está sucediendo exactamente sin poder ver muchos de los parámetros, y tal vez tengas que extraerlo con Zod.infer. Pero hay algunas disparidades bastante significativas, y en gran medida provienen de las dos áreas principales que hemos discutido. La capacidad de utilizar el sistema de tipos en tiempo de ejecución para optimizar el proceso de validación, por lo que no necesitamos depender de información proporcionada por el usuario como esta, así como las optimizaciones en el sistema de tipos de TypeScript para garantizar que esto se pueda analizar de manera mucho más eficiente.
En términos de rendimiento en tiempo de ejecución en general, Archetype ha sido muy optimizado y, para el caso base de verificar propiedades simples en un objeto, será básicamente idéntico a algunos de los validadores de tiempo de ejecución más rápidos que existen, como Tibia y TypeBox. Pero donde realmente brilla es en los casos en los que puede aprovechar su profundo conocimiento del sistema de tipos, por ejemplo, para discriminar implícitamente una gran unión. Podría resultar fácilmente en velocidades de 20 o 30 veces más rápidas que incluso los validadores más eficientes en casos donde, nuevamente, puede, a través de múltiples pasos, identificar qué comprobaciones debe realizar secuencialmente para determinar en qué rama de una unión se encuentra, y a menudo podremos verificar esa unión en tiempo constante sin que ni siquiera tengas que pensarlo. Mientras que, nuevamente, las alternativas generalmente son no tener esa opción en absoluto o tener que construir esa lógica manualmente y mantenerla a medida que cambia tu tecnología. Y como punto de referencia, esos casos base de los que hablaba para los validadores de rendimiento existentes ya son aproximadamente 400 veces más rápidos que Zot para este tipo de escenarios. Entonces, ciertamente, si necesitas optimizar el rendimiento, también habrá grandes ganancias en esa área.
Sé que estamos quedando sin tiempo aquí, solo quería demostrar algunas de mis características favoritas de la próxima versión, que espero, supongo, es la versión actual ahora que estás viendo este video. Ha sido difícil llegar a este punto, hay tantas cosas que quería cubrir. Definitivamente, el alcance creció mucho más de lo que había anticipado en términos de las mejoras para la versión beta. Pero espero que, si estás viendo esto y pude envolver todo de la manera que pretendía, ahora puedas probar todas estas cosas. Pero de todos modos, quería mostrar algunas de estas capacidades de inferencia genérica, que creo que son muy interesantes. Entonces, hay una nueva característica en beta que te permite definir estos tipos genéricos. Puedes definir una firma como esta y luego hacer referencia a un parámetro de tipo y luego instanciarlo más adelante y obtendrás esta inferencia uno a uno. Nuevamente, es como en TypeScript. Y luego, funcionará también para la validación en tiempo de ejecución. Puedes definirlos dentro de un ámbito, que es básicamente una forma de vincular palabras clave personalizadas a los tipos que desees. Esta es probablemente la más sorprendente dentro del sistema de tipos de TypeScript que hay aquí. Puedes ver que tenemos este genérico alternativo que toma A y B y se llama a sí mismo, y luego intercambia A y B. Esto es simplemente un genérico recursivo clásico de TypeScript, pero en Archetype esto realmente se puede inferir y puedes ver que, de hecho, obtienes estas entradas alternas. Si lo instanciamos más tarde, lo pasamos de encendido a apagado en lugar de 01, obtienes el resultado esperado y esos dos se alternan. Así que el hecho de que todo esto termine siendo posible dentro de TypeScript fue realmente increíble de descubrir. Nuevamente, felicitaciones al equipo de TypeScript por crear un analizador tan increíble, una herramienta increíble que admitiría probablemente de manera no intencional este nivel de profundidad solo dentro de su propio sistema de tipos. Creo que es increíble.
Comments