Video Summary and Transcription
TypeScript no tiene verificación de tipos en tiempo de ejecución, pero existen bibliotecas disponibles para la validación de tipos en tiempo de ejecución. ZAD es una popular biblioteca de validación de tipos en tiempo de ejecución en el ecosistema de React, que ofrece primitivas de esquema para validaciones específicas en tipos primitivos y soporte para datos complejos como objetos y matrices. ZAD también proporciona métodos para analizar valores y manejar el análisis correcto o fallido con objetos de error.
1. Introducción a TypeScript y Tipos en Tiempo de Ejecución
Hola a todos, hoy me gustaría hablarles sobre un tema muy interesante relacionado con TypeScript, es decir, la seguridad de tipos en tiempo de ejecución. TypeScript no es perfecto y nunca cumplirá todas las expectativas de todos los usuarios. En las etapas iniciales de TypeScript, surgió la pregunta sobre la posibilidad de tener un sistema de tipos en tiempo de ejecución, pero se estableció que la verificación de tipos en tiempo de ejecución queda fuera de los objetivos de diseño. TypeScript se compila a JavaScript, por lo que no hay validación de tipos en tiempo de ejecución. Una solución potencial es utilizar tipos o validadores en tiempo de ejecución, y existen varias bibliotecas disponibles. Puedes elegir una biblioteca en función de criterios como rendimiento y popularidad. Las cinco principales bibliotecas de tipos en tiempo de ejecución según las estrellas de GitHub son Yap, AJV, Zad, IOTS y Runtypes.
Hola a todos, hoy me gustaría hablarles sobre un tema muy interesante relacionado con TypeScript, es decir, la seguridad de tipos en tiempo de ejecución, pero antes de eso, me gustaría presentarme. Soy Kejtan Świątek, soy un desarrollador front-end de Wrocław, y pueden encontrar mi trabajo en Twitter, en kejtansw, o en mi blog kejtan.dev, donde ocasionalmente escribo sobre programación funcional en el front-end y cosas que aprendo en el camino.
Permítanme comenzar esta presentación afirmando que TypeScript no es perfecto, y sé que es una afirmación bastante audaz, considerando que esta es una conferencia de TypeScript, y espero que los organizadores no me prohíban de por vida por ello, pero lo que quiero decir es que TypeScript, al igual que cualquier otra herramienta, nunca cumplirá todas las expectativas de todos sus usuarios. Y en las etapas iniciales de TypeScript, una de las expectativas era tener un sistema de tipos en tiempo de ejecución, y la comunidad preguntó si era una pieza faltante del ecosistema de TypeScript. Esta pregunta fue respondida bastante temprano y en 2014 se estableció que la verificación de tipos en tiempo de ejecución queda fuera de los objetivos de diseño de TypeScript. Y como pueden ver, esto generó sentimientos encontrados en la comunidad. Pero creo que después de ocho años desde esa respuesta, esto se ha asentado en nuestras mentes como desarrolladores de TypeScript. Y nos hemos acostumbrado bastante al hecho de que TypeScript en su núcleo es simplemente JavaScript. Y lo que quiero decir con eso es que después de que terminamos nuestro trabajo con nuestro código, se compila a JavaScript para ser interpretado por diferentes entornos de ejecución como Node.js o nuestros navegadores. Así que nos deshacemos de todas nuestras interfaces y tipos. Por lo tanto, no tenemos validación de tipos en tiempo de ejecución.
Y el ejemplo más simple de eso puede ser obtener algunos datos de APIs externas. Este es un código común en nuestros proyectos de TypeScript. Tenemos una interfaz para nuestros datos en tiempo de ejecución. Obtenemos estos datos de alguna API y analizamos la respuesta a un objeto JSON. Pero pueden ver en la línea 7 que declaramos que nuestro valor en tiempo de ejecución es de tipo Hero, pero la pregunta aquí es ¿qué tan seguros estamos de que el objeto de retorno aquí es realmente de tipo Hero? Y les puedo asegurar que en este ejemplo, no estamos 100% seguros de eso. Entonces, ¿cuál es la solución potencial a este problema? Podrían ser los tipos en tiempo de ejecución, también conocidos como validadores en tiempo de ejecución o validadores de esquemas o decodificadores JSON. Y ¿qué hay del ecosistema de TypeScript? Como con casi todos los problemas, podemos implementarlo nosotros mismos o usar una biblioteca para ello. Afortunadamente, para los tipos en tiempo de ejecución o los validadores en tiempo de ejecución, existen varias bibliotecas que hacen precisamente eso. Y puedes elegir una biblioteca que se adapte a tus necesidades. Hay diferentes criterios que puedes utilizar. Por ejemplo, el rendimiento de dicho análisis. Y la mejor fuente de información al respecto se llama TypeScript runtime type benchmarks. Es un repositorio de GitHub y puedes encontrarlo bajo el código QR aquí en la esquina. Básicamente, te brinda diferentes estadísticas sobre diferentes tipos de análisis y afirmación de tipos, y te proporciona benchmarks de rendimiento de esos para diferentes bibliotecas. Y al igual que con cualquier otra biblioteca, otro criterio que puedes utilizar para encontrar la que se adapte a tus necesidades es la popularidad. Y a todos nos gusta medir la popularidad por las estrellas de GitHub. Así que aquí lo tienes, las cinco principales bibliotecas de tipos en tiempo de ejecución según el número de estrellas de GitHub. Y esas son Yap, AJV, Zad, IOTS y Runtypes. Aquí me gustaría darles un pequeño adelanto de una de esas bibliotecas.
2. ZAD: Biblioteca de Validación de Tipos en Tiempo de Ejecución
ZAD es una biblioteca de validación de tipos en tiempo de ejecución que se utiliza a menudo en el ecosistema de React. Proporciona primitivas de esquema para JavaScript y TypeScript, lo que permite validaciones específicas en tipos primitivos como cadenas y números. ZAD también admite la creación de esquemas para datos complejos como objetos y matrices, con la capacidad de extraer tipos inferidos del esquema creado. Además, ZAD ofrece combinadores para extender y fusionar esquemas de objetos, así como seleccionar y omitir campos. En la práctica, ZAD proporciona métodos como parse y SaveParse para analizar valores y manejar el análisis exitoso o fallido con objetos de error.
ZAD: Biblioteca de Validación de Tipos en Tiempo de Ejecución
Y para eso he elegido ZAD. Y no porque sea el más rendimiento o el más popular, simplemente porque se menciona con frecuencia en el ecosistema de React y también tiene una API bastante sencilla.
Comenzando desde lo básico, ZAD tiene algo llamado primitivas de esquema, es decir, esquemas primitivos para cada tipo primitivo de JavaScript y TypeScript, como cadenas, números, booleanos, incluso fechas o tipos vacíos como undefined o null. A partir de ahí, podemos ser más específicos. Por ejemplo, crear un esquema para una cadena que tenga un número máximo de caracteres o que tenga un formato de correo electrónico o de URL, algo así. Y también para números, como un número mayor que algún valor o menor que algún valor o un valor entero y muchos otros métodos específicos para esas primitivas de esquema.
También podemos crear esquemas para datos más complejos como objetos o matrices. Por ejemplo, con el método object, creamos nuestro esquema para el tipo de perro pasando la estructura deseada con nombre y edad. Pero en lugar de valores, pasamos las primitivas de esquema para esos campos. Lo que también es genial de ZAD es que podemos extraer el tipo inferido del esquema creado, por lo que podemos crear un tipo de perro utilizando el tipo inferido de ZAD. Si también estás interesado en reutilizar nuestros esquemas, hay algunos combinadores para extender y fusionar esquemas de objetos y para seleccionar y omitir algunos campos del esquema de objeto.
¿Cómo podemos usar nuestros esquemas en la práctica? Por ejemplo, creemos un esquema para un tipo de cadena básico. Luego podemos usar el método parse para analizar nuestro valor. Pasamos nuestro valor en tiempo de ejecución y si el análisis es exitoso, simplemente devuelve nuestro valor sin cambios. Pero si falla, muestra un error de ZAD. Pero si no nos gusta lanzar errores, podemos usar el método SaveParse y devuelve un objeto con información sobre si el análisis fue exitoso o no. Y si lo es, devuelve nuestros datos como carga útil o nuestro objeto de error si el análisis falla.
Eso es todo de mi parte. Les he dado toda la teoría detrás de los validadores en tiempo de ejecución, les he dado una lista de posibles soluciones y también les he presentado una de ellas. Ahora es su turno de probarlo en su proyecto. Muchas gracias por escuchar y asistir a esta conferencia y que tengan un buen día.
Comments