TypeScript y la Base de Datos: ¿Quién es el Propietario de los Tipos?

Rate this content
Bookmark

A todos nos encanta escribir tipos en TypeScript, pero a menudo nos encontramos teniendo que escribir tipos en otro lenguaje también: SQL. Esta charla presentará la historia de elige-tu-propia-aventura que enfrentas al combinar TypeScript y SQL, y te guiará a través de los compromisos entre las diversas opciones. Combinados de manera deficiente, TypeScript y SQL pueden ser duplicativos y una fuente de dolores de cabeza, pero si se hacen bien, pueden complementarse mutuamente al abordar las debilidades de cada uno.

27 min
29 Apr, 2022

Video Summary and Transcription

La charla analiza el uso de TypeScript y SQL juntos en el desarrollo de software. Explora diferentes enfoques, como el uso de un ORM como TypeORM o un generador de esquemas como pg2ts. También se discuten constructores de consultas como connects JS y herramientas como PGTyped. Se destacan los beneficios y compromisos de usar TypeScript y SQL, enfatizando la importancia de encontrar un enfoque intermedio.

Available in English

1. Working with a Database and Types

Short description:

Estoy trabajando en una nueva aplicación con una base de datos para libros, autores y reseñas. El servidor web se conecta a la base de datos, ejecuta una consulta y muestra todos los libros. Encontré un error y descubrí la necesidad de tipos. Al definir una interfaz de libro y especificar la estructura de la tabla, resolví los errores de tipo. Ejecutar una migración me permitió manejar la posibilidad de valores nulos para el año de publicación.

autores y reseñas de libros. Incluso tengo algunos data que he agregado allí, así que tengo algunos de mis libros favoritos. Y tengo un servidor web genial aquí, así que se conecta a la database, ejecuta una consulta y muestra todos los libros. Así que sí, creo que está bastante bien. Echemos un vistazo.

Entonces creo que parece que tal vez tiene un error. Así que veamos qué está pasando aquí. Veamos. Supongo, ¿cuál es el tipo de libros? Es Any, es el resultado de la consulta Any, lo que significa que el libro tiene un tipo Any. Entonces tal vez debería escribir, tal vez debería usar tipos para resolver este problema, porque después de todo, esto es TS Congress, así que podemos definir una interfaz de libro. Y veamos la estructura de esta tabla. Así que tenemos un ID, que es una cadena, y tenemos creado por, que es una cadena. Y tenemos título, que es una cadena, y tenemos año de publicación. Vamos a copiar eso. Para las personas de JavaScript, los enteros son un tipo especial de número. Así que vamos a poner número. Y por último, pero no menos importante, tenemos contenido, que es una cadena, o creo que podría ser nulo. Y con la biblioteca node-progress, creo que puedes especificar un tipo de retorno para una consulta. Y mira, tenemos algunos errores de tipo. Así que sí, creo que solo escribí mal año. Debería ser año de publicación. Así que vamos a corregir eso. Y ahora, si vamos aquí, ¡hey, qué sabes! Muy bien. Los tipos definitivamente pueden ser útiles cuando trabajas con SQL. Pero no es toda la historia. Así que veamos qué sucede cuando ejecutas una migración. Así que me di cuenta de que el año de publicación podría ser nulo si no sabemos cuándo se publicó. Por ejemplo, ¿quién sabe exactamente cuándo se publicaron la Ilíada y la Odisea? Mejor dejarlo como nulo. Así que vamos a ejecutar eso.

2. Handling Database Schema Changes

Short description:

Nos encontramos con un problema cuando el esquema de datos en la base de datos cambió, pero el tipo que escribimos manualmente no se actualizó en consecuencia. Al hacer que el año de publicación sea nullable, resolvimos el error. TypeScript proporcionó un mensaje de error cuando intentamos restar null, lo que nos permitió solucionar el problema agregando una condicional.

Y podemos confirmarlo. Sí, tenemos nuestros nuevos libros y el año de publicación es null. Así que sí, veamos qué sucede. Sí, null. Y dato curioso, en JavaScript 2022 menos null es en realidad 22 porque JavaScript. Entonces, el problema aquí es que cambiamos nuestro esquema de datos en la base de datos, pero este tipo que escribimos a mano no se actualizó para reflejar ese cambio. Entonces, realmente, el año de publicación ahora es nullable. Debería ser número o null. Y una vez que hacemos ese cambio, entonces TypeScript nos muestra un error, ¿verdad? Entonces sí, TypeScript es lo suficientemente amable como para decir que no se puede restar null. Y creo que aquí tengo la solución. Solo agregamos una condicional. Sí, genial. Y veamos si eso soluciona las cosas. Efectivamente, lo hace. Entonces, una vez más, los tipos pueden ser muy útiles, pero también pueden haber algunos problemas potenciales aquí.

3. Using TypeScript and SQL with TypeORM

Short description:

Voy a repasar diferentes enfoques para usar TypeScript y SQL juntos. Vimos el enfoque ingenuo de escribir SQL en bruto y codificar a mano los tipos, pero carece de una única fuente de verdad. Si los tipos y la base de datos no están de acuerdo, no sabes cuál es el correcto. La primera opción es decidir dónde quieres que esté la fuente de verdad. Si está en TypeScript, puedes usar TypeORM, que define las tablas a través de clases de JavaScript. El código del servidor utiliza el administrador de entidades para consultar la base de datos y capturar errores. TypeORM puede generar migraciones basadas en los cambios en TypeScript.

Así que en esta charla de hoy, voy a repasar diferentes enfoques para usar TypeScript y SQL juntos, lo cual creo que es una especie de enfoque de elige tu propia aventura. Hay muchas formas diferentes de hacerlo. Por cierto, si te gusta esta charla, puedes seguirme en Twitter o visitar mi blog y mi libro. Así que vimos el enfoque ingenuo, que consiste en escribir SQL en bruto y codificar a mano los tipos para los resultados. Hay algunas cosas buenas en esto. Como vimos, obtenemos cierta seguridad de tipos. Y otra cosa buena es que no introduce ninguna capa de indirección. Realmente estás lidiando directamente con el SQL y los tipos. El problema es que no tenemos una única fuente de verdad, ¿verdad? Si los tipos y la base de datos no están de acuerdo, como vimos cuando hicimos que el año de publicación sea nullable, entonces no sabes cuál es el correcto. Y ese es el problema fundamental con este enfoque. Entonces, la primera elección que realmente debes hacer es dónde quieres que esté la fuente de verdad. ¿Debería estar en la base de datos o en TypeScript? Si quieres que la fuente de verdad esté en TypeScript, eso significa que estás usando un ORM. Veamos cómo se ve este ejemplo usando TypeORM. TypeORM es uno de los ORMs estándar para JavaScript. ORM significa Mapeador Objeto-Relacional. Con TypeORM, definimos esta fuente de datos que indica cómo conectarse a nuestra base de datos y proporcionamos una lista de entidades y deberían resultar familiares. Se corresponden con las tablas de nuestro ejemplo anterior. Y en lugar de definir las tablas a través de SQL, las definimos a través de clases de JavaScript y proporcionamos estos decoradores para indicarle a TypeORM que esto debe convertirse en una tabla y que estos deben convertirse en columnas. Y también un poco sobre qué tipo de columna son. En casos donde el tipo de TypeScript es ambiguo, debemos proporcionar información sobre el tipo de SQL y también podemos proporcionar información sobre la nulabilidad. Y para relaciones externas, podemos proporcionar información sobre la relación. Veamos cómo se ve el código del servidor. En lugar de ejecutar una consulta SQL en bruto, obtenemos este administrador de entidades y le decimos que encuentre la clase de libro y TypeORM sabe convertir eso en una consulta de selección en la tabla de libros. Y lo bueno de esto es que el tipo de resultado de esto es un array de libros, que es exactamente lo que deseas, por lo que tenemos suficiente información de tipo aquí para capturar el error. Podemos cambiar esto a año de publicación, y año de publicación, y veamos si podemos cargar esto aquí. ¡Hey, ahí lo tienes! Entonces, ¿cómo se ven las migraciones en este mundo? Pasemos por el mismo proceso de decir que esta columna puede ser nullable y también necesitamos agregar null a su tipo. Puedes ver que ya hemos obtenido un error en nuestro TypeScript, lo cual es bueno. Una de las cosas geniales de un ORM es que puede generar las migraciones por ti. Y aquí va a detectar lo que hemos cambiado en nuestro TypeScript y nos dirá que ha generado una migración.

4. Migration Process and Source of Truth

Short description:

Veamos el proceso de migración y cómo solucionar errores. Al incluir información sobre las relaciones de entidades, podemos obtener datos adicionales de la base de datos. Los ORMs resuelven el problema de mantener los tipos y la base de datos sincronizados, generan migraciones y simplifican la escritura de consultas. Sin embargo, pueden ser una abstracción imperfecta, requiriendo conocimiento de SQL, TypeScript y el ORM. Ajustar el rendimiento de las consultas puede agregar sobrecarga y otros usuarios pueden tener problemas con la fuente de verdad en TypeScript.

Veamos eso. Es más o menos lo que esperarías, alterar tabla, alterar columna, eliminar nulos. La migración inversa lo revierte. Esperemos no tener que ejecutar la migración inversa. Intentemos ejecutar esta migración. Dice que debería confirmar. Genial. Ahora arreglemos este error sobre un posible objeto nulo. Tengo una solución aquí. Bien. Esperemos un segundo. Una vez que esto cargue, deberíamos tener una solución. Sí, genial. Dado que hemos incluido información sobre las relaciones entre las entidades, también podemos ir al siguiente nivel, podemos decirle a TypeORM que incluya la relación 'creado por'. Y ahora podemos agregar otra columna y podemos hacer book.createdby.name. Esto debería mostrar el nombre del autor además de la fecha de publicación. Bastante genial. Así es como se ve si colocas la fuente de verdad en TypeScript. Hay cosas buenas en esto. Los ORMs definitivamente resuelven el problema de mantener los tipos y la base de datos sincronizados. Es bastante bueno que generen migraciones por ti y las consultas simples son bastante directas de escribir en los ORMs. Y los ORMs, encontrarás mucha aversión hacia ellos en línea, pero es innegable que se utilizan ampliamente. Por otro lado, son el ejemplo clásico de una abstracción imperfecta. La teoría con un ORM es que puedes tratar la base de datos como un detalle de implementación y simplemente trabajar en TypeScript. Pero en la práctica, eso no funciona realmente. Para usar un ORM de manera efectiva, necesitas conocer SQL, necesitas conocer TypeScript y necesitas saber cómo usar el ORM. Y al hacer cosas como ajustar el rendimiento de una consulta, terminas trabajando con tu ORM para intentar producir una consulta SQL muy específica, lo cual agrega cierta sobrecarga. Además, si trabajas en un entorno donde hay múltiples usuarios de tu base de datos, los otros usuarios pueden tener problemas con que tú estés colocando la fuente de verdad.

5. Generación de archivos de esquema TypeScript

Short description:

Si no estás utilizando un ORM, tener una versión de TypeScript de tu esquema es útil. Herramientas como Schema TS, PyST Schema TS y pg2ts pueden generar archivos de esquema TypeScript a partir de tu base de datos. pg2ts se conecta a tu base de datos Postgres y genera un archivo de esquema de base de datos auto-generado con interfaces para todas las tablas. Al utilizar este enfoque, te aseguras de que el archivo de esquema TypeScript y la base de datos nunca se desincronicen, ya que la base de datos es la fuente de verdad.

en TypeScript en lugar de la base de datos en sí. También hay mucho más cambio en la moda del mes con los ORMs que con las propias bases de datos. Postgres y MySQL han estado presentes durante décadas y siguen siendo muy populares. Entonces, ¿qué pasa si no vas a usar un ORM? Bueno, entonces es indudablemente útil tener una versión de TypeScript de tu esquema. Así que puedes hacerlo al revés. Puedes ir desde el esquema de la base de datos a TypeScript. Veamos eso. Veamos las herramientas para generar archivos de esquema TypeScript a partir de tu base de datos. El abuelo en este espacio es Schema TS, que tiene muchas estrellas. Y luego no ha tenido cambios en más de cuatro años. Así que también tiene muchos forks. Luego está PyST Schema TS, que tiene unos dos años de antigüedad. Así que también tiene muchos forks. Y yo tengo uno llamado pg2ts. Y eso es lo que mostraré a todos hoy. La idea con pg2ts es que ejecutas un comando y así, pg2ts generate, se conecta a tu base de datos Postgres y genera este archivo de esquema de base de datos. Veamos ese archivo de esquema de base de datos. Auto-generado y tiene interfaces para todas nuestras tablas. Lo bueno de esto es que no tienes que escribir este tipo de libro a mano. Así que conectémoslo, como hicimos antes. Vamos a importar, y ahora deberíamos obtener un error de tipo. Sí, debería ser año de publicación y esto también debería ser año de publicación. Ahí vamos. Y veamos si eso soluciona el problema. Efectivamente, lo hace.

Superficialmente, esto podría no parecer muy diferente a lo que hicimos antes, cuando escribimos el tipo a mano, pero la belleza de esto es que en la práctica, ejecutarías PGTTS como parte de tu integración continua testing. Y así, te asegurarías de que este archivo de esquema TypeScript y la base de datos nunca se desincronicen entre sí. Entonces, la base de datos es la fuente de verdad y este esquema de base de datos se deriva de ella. Intentemos ejecutar la migración. Ahora, si miramos este año de publicación, es nulo.

6. Generador de esquemas y constructor de consultas

Short description:

Voy a volver a ejecutar PGTTS generate para escanear la base de datos nuevamente. El generador de esquemas produce entidades que corresponden a los tipos de base de datos en TypeScript y los mantiene sincronizados. Agrega un paso de compilación y requiere anotaciones de tipo manuales para las consultas. Si no estás utilizando un ORM, se recomienda utilizar un generador de esquemas.

Y volvamos a mostrar nuestro esquema de base de datos. De acuerdo. Así que voy a volver a ejecutar PGTTS generate. Por lo tanto, va a escanear nuestra database nuevamente y, sorprendentemente, el año de publicación ahora es nulo. Y ahora también obtenemos un error de tipo, igual que antes. Eso es lo que hace un generador de esquemas. Hace un trabajo realmente bueno al producir entidades que corresponden a tu database tipos en tu typescript y mantenerlos sincronizados. La desventaja es que agrega un paso de compilación y debes agregar manualmente las anotaciones de tipo para tus consultas. A menos que agregues algún otro proceso del cual hablaremos más adelante. Pero, en general, si no estás utilizando

7. Usando Connects JS para la construcción de consultas

Short description:

Una vez que hayas decidido si usar un constructor de consultas o SQL sin procesar, Connects JS es una opción popular para JavaScript y TypeScript. Infiere automáticamente los tipos y ayuda a detectar errores. Al definir tablas y usar la tabla de tipos de Connects, puedes asegurarte de que se obtengan los tipos correctos. Las migraciones se pueden utilizar para manejar cambios en el esquema y también son posibles consultas más complejas, como unir tablas.

Si no estás utilizando un ORM, debes usar un generador de esquemas. Entonces, una vez que hayas hecho eso, tu siguiente pregunta es si quieres usar un constructor de consultas o escribir SQL sin procesar. Así que veamos la opción del constructor de consultas. Connects JS es probablemente el constructor de consultas más popular para JavaScript y TypeScript. Veamos cómo se ve este ejemplo usando Connects. Para consultar la base de datos, usamos este objeto Connects y le decimos que queremos ver la tabla de libros y queremos seleccionar todo de ella. Y Connects es lo suficientemente inteligente como para darse cuenta de que tiene un tipo de libro y ya obtenemos algunos errores de tipo, que es lo que queríamos. ¿Cómo funciona esto? Así que supongo que estás ejecutando pg2ts o algo similar para obtener esta interfaz de libro definida en TypeScript. Ese es un bloque de construcción importante. Luego está también esta tabla de tipos de Connects, que puedes usar para informar a Connects sobre tu esquema. Entonces, defines esta interfaz de tablas y tiene una lista de todas tus tablas. Y es capaz de, si consultas desde una de estas tablas, puede obtener los tipos correctos. Así que eso es bastante genial. Así que podemos corregir el error aquí. Y aquí. Genial. Guardemos eso. Y recarguemos. Genial. El error está solucionado. Así que veamos cómo se ve una migración en este mundo. Así que voy a ejecutar mi migración. Y ahora, como recordarás, el año de publicación es nulo. Así que ahora tengo que regenerar el esquema de la base de datos. Así que ahora, si voy y miro el esquema de la base de datos, sí, el año de publicación es nulo. Y efectivamente, tenemos un error de tipo en index.ts, que es exactamente lo que queremos. Y podemos corregir el error y si vamos aquí, genial, está solucionado. También puedes hacer consultas un poco más elaboradas con Connects. Aquí tienes un ejemplo de unir la tabla de libros con el autor. Así que vamos a agregar eso. Estamos consultando la tabla de libros como antes, pero ahora, vamos a unir con la tabla de usuarios, uniendo la columna book.createdBy con la columna users.id, y si observas el tipo inferido, es book y users, el tipo de intersección, que en realidad

8. Using Query Builders and PGTyped

Short description:

Agreguemos el autor y veamos si funciona. Los Query Builders proporcionan tipos precisos sin anotaciones explícitas, pero pueden ser complejos. PGTyped es una herramienta que convierte consultas SQL en tipos de TypeScript, generando un archivo de tipos. Ejecuta la consulta y devuelve el tipo como any. Al agregar el tipo de consulta a la plantilla etiquetada, obtenemos un tipo agradable y podemos corregir cualquier error. PGTyped hace una introspección en el esquema de la base de datos en vivo, lo que nos permite ejecutar migraciones y manejar campos nulos.

exactamente correcto. Entonces, sigamos adelante y agreguemos el autor. Creo que sale como nombre, y si guardamos, deberíamos poder cargarlo. Sí, funcionó, bastante genial. Bien, ¿cómo se compara el Query Builder con algunas de las otras soluciones que hemos visto? Entonces, creo que lo bueno aquí es que definitivamente obtienes tipos precisos y no tienes que ingresarlos manualmente. Puede utilizar el esquema de la base de datos y sus consultas para obtener tipos precisos sin anotaciones explícitas, lo cual es genial, pero desafortunadamente, los Query Builders son otro ejemplo clásico de una abstracción defectuosa. Entonces, para usar un Query Builder, especialmente para consultas más complicadas, realmente necesitas conocer tu TypeScript, realmente necesitas conocer tu SQL y realmente necesitas conocer tu Query Builder. Entonces, si miramos la documentación de Connex, ellos afirman que su soporte de TypeScript es el mejor esfuerzo. Creo que lo están subestimando un poco. Creo que es bastante bueno. Pero si miras algunas de estas consultas, no me queda del todo claro que la sintaxis del Query Builder sea más simple o más complicada que la sintaxis SQL de Postgres. Y en ese punto, lo que se ejecuta es SQL, por lo que probablemente deberías simplemente escribir el SQL de todos modos.

Entonces, ¿qué pasa si no vas a usar un Query Builder? Bueno, entonces tenemos otra opción, que es una herramienta para convertir tus consultas SQL directamente en tipos de TypeScript. Hay algunas herramientas como esta y vamos a ver PGTyped. PGTyped es una herramienta que lee consultas SQL y genera tipos de TypeScript para ti. Tiene una buena documentación aquí. Así que veamos cómo puede ayudarnos. Con PGTyped, importas esta etiqueta SQL y la agregas a tus consultas SQL y luego pasas tu pool de database y cualquier parámetro a la consulta y la ejecuta por ti. Y el tipo vuelve como any. Entonces, ¿cuál es el punto de eso? Lo interesante aquí es que podemos ejecutar PGTyped y generará un archivo de tipos para nosotros, así que echemos un vistazo a esto. Esto tiene el tipo de resultado de la consulta y si tuviéramos parámetros en la consulta, también los incluiría. Y la idea es que agregas este tipo de consulta a la plantilla etiquetada y tenemos que importarlo. Y ahí lo tienes y ahora tenemos un buen tipo y muestra el error, así que sabemos que podemos corregirlo. Corrígelo y ahí lo tienes. Lo interesante aquí es que no ejecuté, no generé un esquema de db simplemente está haciendo una introspección en esta consulta contra nuestro esquema de base de datos en vivo. Entonces podemos intentar ejecutar una migración. Así que vamos a hacer eso. Así que podemos verificar que nuestro libro, sí, el año de publicación es nulo y así que aún no tenemos un error, pero si volvemos y volvemos a ejecutar pgTyped ahora sabe que el año de publicación es nulo, por lo que necesitamos agregar una expresión más cuidadosa allí. Así que probémoslo.

9. Using CreedlyTyped and PGTyped

Short description:

Aquí uno manualmente une el autor para extraer el nombre del autor de la otra tabla. Ejecutar pgTyped nuevamente con la consulta actualizada proporciona el tipo correcto. Aunque SQL sin procesar con tipos es genial, hay desventajas como una inferencia de tipo imperfecta y la necesidad de un paso de compilación. Los resultados de la consulta pueden ser un poco tipo pato, lo que resulta en diferentes tipos para la misma consulta. El punto óptimo se encuentra entre la conversión de SQL a TS y los constructores de consultas. CreedlyTyped genera consultas simples, mientras que PGTyped maneja las más complejas. Exploremos CreedlyTyped y PGTyped creando un typedDB y utilizando el objeto de tablas de nuestro esquema de base de datos.

Sí, ahí vamos. Y también podemos probar una consulta más complicada aquí. Así que aquí uno se une manualmente al autor para poder obtener eso. Así que puedo extraer el nombre del autor de la otra tabla, de la tabla de usuarios. Ahora que he cambiado mi consulta, debo ejecutar pgTyped nuevamente. Y si observo esta consulta, ahora tiene authorName y tiene el tipo correcto. Así que puedo ir aquí y agregar mi authorName. Y déjame ver. El servidor se reiniciará, y ahí lo tienes, tenemos los nombres de los autores.

Bien, ¿cómo se compara esto? Lo genial es que solo tienes que escribir SQL sin procesar y obtienes tipos para tus consultas. Sin embargo, hay algunas desventajas. No todos los tipos se devuelven perfectamente. Por lo tanto, hay algunos problemas para detectar cuándo una columna en los resultados de una consulta puede ser nula. Al igual que con algunos de los otros enfoques, se agrega un paso de compilación. Los resultados de las consultas son un poco tipo pato. Entonces, si ejecutas la misma consulta exacta en dos lugares diferentes, obtendrás dos tipos distintos. Serán compatibles. Y con la tipificación estructural, eso está bien. Pero creo que generalmente es mejor trabajar con el esquema de la base de datos. Y a veces parece un poco complicado para consultas realmente simples que tienes que escribir esta declaración etiquetada de SQL y luego agregar un tipo que generas para ellas. Por lo tanto, creo que entre la conversión de SQL a TS y los constructores de consultas, hay un punto óptimo. Quiero mostrarte cómo se ve eso. Hay algunos enfoques. Zapatos es un ejemplo. Pero te mostraré PGTyped y CreedlyTyped, que es una herramienta que construí. La idea con CreedlyTyped es que genera todas las consultas simples para ti. Pero si tu consulta deja de ser simple y se vuelve más complicada, entonces simplemente debes ejecutar algo como PGTyped. No intenta modelar esas consultas. Echemos un vistazo. Vamos a crear un typedDB. Y le pasaremos un objeto de tablas de nuestro esquema de base de datos, que se genera como antes. Y en lugar de generar la consulta GetBooks de esta manera, haremos

10. Using TypeScript and SQL: Benefits and Trade-offs

Short description:

Esta sección analiza los beneficios de usar TypeScript y SQL juntos. Destaca un enfoque intermedio donde se utiliza rawSQL para consultas complejas, proporcionando tipos precisos. Para consultas más simples, se pueden obtener tipos precisos basados en el esquema de la base de datos. Sin embargo, existen desventajas, como la necesidad de un paso de compilación y la tentación de depender demasiado de consultas generadas simples. La charla concluye enfatizando la importancia de ser consciente de los compromisos involucrados al trabajar con SQL y TypeScript.

getbooks es igual a typedDB.table. Conoce nuestras tablas. Y simplemente vamos a generar un select. Y simplemente llamamos a esto con nuestro pool de db. Y genial. Así que conoce los tipos, los tipos hacen referencia a nuestro esquema de db. No tenemos esto porque no hemos hecho una unión.

Y así que si vamos aquí, sí, funciona. Y puedes agregar algunas cosas un poco más complicadas como si quisieras hacer una unión. En realidad, lo extrae como, ¿qué es? Creado por. Sí, creado por. En realidad, lo extrae como un subobjeto. Entonces es author.name. Y sí, ahí vamos. Bueno, ¿cómo se compara esto? Creo que bastante bien. Creo que es un buen punto intermedio. Para consultas complicadas, simplemente puedes escribir rawSQL y obtener tipos precisos. Pero para las consultas más simples, que en mi aplicación principal son aproximadamente el 70% de las consultas. No tienes que pasar por mucho proceso y obtienes tipos precisos basados en el esquema de tu base de datos. Hay algunas desventajas. Todavía agrega un paso de compilación. Y creo que a veces hay la tentación de usar las consultas generadas simples con más frecuencia de lo que deberías. Entonces en lugar de ejecutar 10 consultas simples, probablemente deberías mover parte de esa lógica a Postgres y ejecutar solo una consulta. Eso es la charla. Hay muchas opciones para elegir cuando estás trabajando con SQL y TypeScript y ninguna de las opciones es perfecta. Pero creo que lo importante es ser consciente del enfoque que estás tomando y comprender los compromisos. Espero que hayas disfrutado la charla. Echa un vistazo a mi libro y mi blog y sígueme en Twitter. Gracias.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

React Day Berlin 2023React Day Berlin 2023
21 min
React's Most Useful Types
We don't think of React as shipping its own types. But React's types are a core part of the framework - overseen by the React team, and co-ordinated with React's major releases.In this live coding talk, we'll look at all the types you've been missing out on. How do you get the props type from a component? How do you know what ref a component takes? Should you use React.FC? And what's the deal with JSX.Element?You'll walk away with a bunch of exciting ideas to take to your React applications, and hopefully a new appreciation for the wonders of React and TypeScript working together.
Vue.js London 2023Vue.js London 2023
30 min
Stop Writing Your Routes
The more you keep working on an application, the more complicated its routing becomes, and the easier it is to make a mistake. ""Was the route named users or was it user?"", ""Did it have an id param or was it userId?"". If only TypeScript could tell you what are the possible names and params. If only you didn't have to write a single route anymore and let a plugin do it for you. In this talk we will go through what it took to bring automatically typed routes for Vue Router.
TypeScript Congress 2023TypeScript Congress 2023
31 min
Making Magic: Building a TypeScript-First Framework
I'll dive into the internals of Nuxt to describe how we've built a TypeScript-first framework that is deeply integrated with the user's IDE and type checking setup to offer end-to-end full-stack type safety, hints for layouts, middleware and more, typed runtime configuration options and even typed routing. Plus, I'll highlight what I'm most excited about doing in the days to come and how TypeScript makes that possible not just for us but for any library author.
React Advanced Conference 2021React Advanced Conference 2021
6 min
Full-stack & typesafe React (+Native) apps with tRPC.io
Top Content
Why are we devs so obsessed with decoupling things that are coupled nature? tRPC is a library that replaces the need for GraphQL or REST for internal APIs. When using it, you simply write backend functions whose input and output shapes are instantly inferred in your frontend without any code generation; making writing API schemas a thing of the past. It's lightweight, not tied to React, HTTP-cacheable, and can be incrementally adopted. In this talk, I'll give a glimpse of the DX you can get from tRPC and how (and why) to get started.
TypeScript Congress 2022TypeScript Congress 2022
10 min
How to properly handle URL slug changes in Next.js
Top Content
If you're using a headless CMS for storing content, you also work with URL slugs, the last parts of any URL. The problem is, content editors are able to freely change the slugs which can cause 404 errors, lost page ranks, broken links, and in the end confused visitors on your site. In this talk, I will present a solution for keeping a history of URL slugs in the CMS and explain how to implement a proper redirect mechanism (using TypeScript!) for dynamically generated pages on a Next.js website.

Add to the talk notes: https://github.com/ondrabus/kontent-boilerplate-next-js-ts-congress-2022 

Workshops on related topic

React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
React Advanced Conference 2022React Advanced Conference 2022
148 min
Best Practices and Advanced TypeScript Tips for React Developers
Top Content
Featured Workshop
Are you a React developer trying to get the most benefits from TypeScript? Then this is the workshop for you.In this interactive workshop, we will start at the basics and examine the pros and cons of different ways you can declare React components using TypeScript. After that we will move to more advanced concepts where we will go beyond the strict setting of TypeScript. You will learn when to use types like any, unknown and never. We will explore the use of type predicates, guards and exhaustive checking. You will learn about the built-in mapped types as well as how to create your own new type map utilities. And we will start programming in the TypeScript type system using conditional types and type inferring.
Remix Conf Europe 2022Remix Conf Europe 2022
195 min
How to Solve Real-World Problems with Remix
Featured Workshop
- Errors? How to render and log your server and client errorsa - When to return errors vs throwb - Setup logging service like Sentry, LogRocket, and Bugsnag- Forms? How to validate and handle multi-page formsa - Use zod to validate form data in your actionb - Step through multi-page forms without losing data- Stuck? How to patch bugs or missing features in Remix so you can move ona - Use patch-package to quickly fix your Remix installb - Show tool for managing multiple patches and cherry-pick open PRs- Users? How to handle multi-tenant apps with Prismaa - Determine tenant by host or by userb - Multiple database or single database/multiple schemasc - Ensures tenant data always separate from others
GraphQL Galaxy 2020GraphQL Galaxy 2020
106 min
Relational Database Modeling for GraphQL
Top Content
WorkshopFree
In this workshop we'll dig deeper into data modeling. We'll start with a discussion about various database types and how they map to GraphQL. Once that groundwork is laid out, the focus will shift to specific types of databases and how to build data models that work best for GraphQL within various scenarios.
Table of contentsPart 1 - Hour 1      a. Relational Database Data Modeling      b. Comparing Relational and NoSQL Databases      c. GraphQL with the Database in mindPart 2 - Hour 2      a. Designing Relational Data Models      b. Relationship, Building MultijoinsTables      c. GraphQL & Relational Data Modeling Query Complexities
Prerequisites      a. Data modeling tool. The trainer will be using dbdiagram      b. Postgres, albeit no need to install this locally, as I'll be using a Postgres Dicker image, from Docker Hub for all examples      c. Hasura
Node Congress 2024Node Congress 2024
83 min
Deep TypeScript Tips & Tricks
Workshop
TypeScript has a powerful type system with all sorts of fancy features for representing wild and wacky JavaScript states. But the syntax to do so isn't always straightforward, and the error messages aren't always precise in telling you what's wrong. Let's dive into how many of TypeScript's more powerful features really work, what kinds of real-world problems they solve, and how to wrestle the type system into submission so you can write truly excellent TypeScript code.
JSNation Live 2021JSNation Live 2021
156 min
Building a Hyper Fast Web Server with Deno
WorkshopFree
Deno 1.9 introduced a new web server API that takes advantage of Hyper, a fast and correct HTTP implementation for Rust. Using this API instead of the std/http implementation increases performance and provides support for HTTP2. In this workshop, learn how to create a web server utilizing Hyper under the hood and boost the performance for your web apps.