Inferencia de estructuras de resultados de queries
Permita que el constructor de queries infiera el tipo de fila devuelto.
Inferencia de estructuras de resultados de queries es una lección gratuita de TypeScript Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de TypeScript Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de TypeScript Academy incluye 4 lecciones en total.
El tipo de resultado sigue a la selección
Un buen constructor de consultas no solo valida la entrada; también infiere la forma exacta de cada fila resultante a partir de las columnas seleccionadas. Si selecciona menos columnas, el tipo de resultado se restringe.
Selección de la fila completa
Al llamar a select() sin una proyección, se devuelve el tipo de fila completo.
const rows = await db.select().from(users);
// rows: { id: number; name: string; age: number | null; isAdmin: boolean }[]La selección parcial restringe el tipo
Proyecte solo las columnas que necesita y el tipo de resultado contendrá únicamente esas claves.
const rows = await db
.select({ id: users.id, name: users.name })
.from(users);
// rows: { id: number; name: string }[]
// Accessing rows[0].age is a compile error.Cambio de nombre de columnas en el resultado
Las claves del objeto de selección se convierten en las claves del resultado, por lo que puede cambiarles el nombre libremente y el tipo reflejará los nombres nuevos.
const rows = await db
.select({ userId: users.id, fullName: users.name })
.from(users);
// rows: { userId: number; fullName: string }[]Columnas calculadas y agregadas
Las agregaciones llevan su propio tipo inferido. count() produce un número; la clave del alias le da nombre en el resultado.
import { count } from "drizzle-orm";
const rows = await db
.select({ total: count() })
.from(users);
// rows: { total: number }[]La nulabilidad se propaga
Si selecciona una columna que admite valores nulos, su nulabilidad se conserva en el resultado. Seleccionar age mantiene el tipo number | null.
const rows = await db.select({ age: users.age }).from(users);
// rows: { age: number | null }[]Cómo se construye la inferencia
El tipo de resultado es un tipo mapeado sobre el objeto de selección: cada valor es una columna cuyo tipo data (y su nulabilidad) se extrae en la clave correspondiente.
type InferSelect<S> = {
[K in keyof S]: S[K] extends Column<infer D, infer Null>
? Null extends true ? D | null : D
: never;
};Ayudantes para una sola fila
Algunos constructores ofrecen un acceso mediante .get() o [0]. El tipo del elemento sigue derivándose de la misma selección, simplemente extraído del array.
const one = (await db.select({ id: users.id }).from(users))[0];
// one: { id: number } | undefinedLas uniones amplían la forma
Al hacer una unión, el tipo de resultado obtiene claves de la tabla unida. Las selecciones parciales entre tablas unidas también se restringen con precisión. (Las uniones tienen su propia lección).
const rows = await db
.select({ name: users.name, title: posts.title })
.from(users)
.innerJoin(posts, eq(posts.authorId, users.id));
// rows: { name: string; title: string }[]Por qué es importante restringir el tipo
Devolver únicamente las claves seleccionadas evita depender accidentalmente de columnas que no se obtuvieron. El tipo refleja el SQL real, por lo que los errores por solicitar datos de más o de menos aparecen en el editor.
Error común: expandir y seleccionar después
Si obtiene la fila completa y después selecciona manualmente las claves en JS, pierde el beneficio de la restricción a nivel de base de datos y envía columnas adicionales por la red. Es preferible restringir la selección en la consulta.
Comprobación rápida
Confirme su comprensión de las formas de resultado inferidas.
Resumen
El tipo de resultado se calcula a partir de la selección mediante un tipo mapeado: las selecciones completas devuelven la fila completa, las selecciones parciales se restringen a las claves elegidas, los cambios de nombre modifican las claves del resultado, la nulabilidad se propaga y las agregaciones conservan sus propios tipos. El tipo estático siempre refleja el SQL que realmente ha escrito.
Preguntas frecuentes
¿La lección «Inferencia de estructuras de resultados de queries» es gratis?
Sí — el texto completo de «Inferencia de estructuras de resultados de queries» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de TypeScript Academy, actualiza a CoddyKit PRO. El curso de TypeScript Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Inferencia de estructuras de resultados de queries»?
Permita que el constructor de queries infiera el tipo de fila devuelto. Practicas TypeScript Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar TypeScript Academy?
No se requiere experiencia previa. TypeScript Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Inferencia de estructuras de resultados de queries»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de TypeScript Academy?
Sí. Cada lección de TypeScript Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Mapeo de esquemas a tipos
- Construcción de queries segura
- Inferencia de estructuras de resultados de queries
- Relaciones y joins con tipos