Inferindo Estruturas de Resultados de Consultas
Permita que o construtor de consultas infira o tipo da linha retornada.
Inferindo Estruturas de Resultados de Consultas é uma aula grátis de TypeScript Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de TypeScript Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de TypeScript Academy inclui 4 aulas no total.
O Tipo do Resultado Acompanha a Seleção
Um excelente construtor de consultas não apenas valida a entrada; ele também infere a forma exata de cada linha do resultado a partir das colunas selecionadas. Selecione menos colunas e o tipo do resultado ficará mais restrito.
Seleção da Linha Completa
Chamar select() sem uma projeção retorna o tipo da linha inteira.
const rows = await db.select().from(users);
// rows: { id: number; name: string; age: number | null; isAdmin: boolean }[]A Seleção Parcial Restringe o Tipo
Projete somente as colunas necessárias e o tipo do resultado conterá apenas essas chaves.
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.Renomeando Colunas no Resultado
As chaves do objeto de seleção se tornam as chaves do resultado, portanto você pode renomeá-las livremente e o tipo refletirá os novos nomes.
const rows = await db
.select({ userId: users.id, fullName: users.name })
.from(users);
// rows: { userId: number; fullName: string }[]Colunas Calculadas e Agregadas
As agregações carregam seu próprio tipo inferido. count() produz um número; a chave usada como nome identifica esse valor no resultado.
import { count } from "drizzle-orm";
const rows = await db
.select({ total: count() })
.from(users);
// rows: { total: number }[]A Nulabilidade é Propagada
Se você selecionar uma coluna anulável, sua nulabilidade será preservada no resultado. Selecionar age mantém o tipo number | null.
const rows = await db.select({ age: users.age }).from(users);
// rows: { age: number | null }[]Como a Inferência é Construída
O tipo do resultado é um tipo mapeado sobre o objeto de seleção: cada valor é uma coluna cujo tipo de data (e cuja nulabilidade) é extraído para a chave correspondente.
type InferSelect<S> = {
[K in keyof S]: S[K] extends Column<infer D, infer Null>
? Null extends true ? D | null : D
: never;
};Auxiliares para uma Única Linha
Alguns construtores oferecem acesso por meio de .get() ou [0]. O tipo do elemento ainda é derivado da mesma seleção, apenas é extraído da matriz.
const one = (await db.select({ id: users.id }).from(users))[0];
// one: { id: number } | undefinedAs Junções Ampliam a Forma
Quando você faz uma junção, o tipo do resultado ganha chaves da tabela unida. Seleções parciais entre tabelas unidas ainda restringem o tipo com precisão. (As junções terão sua própria lição.)
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 Que a Restrição Importa
Retornar somente as chaves selecionadas evita a dependência acidental de colunas que não foram buscadas. O tipo reflete o SQL real, portanto problemas de busca excessiva ou insuficiente aparecem no editor.
Armadilha: Espalhar e Depois Selecionar
Se você buscar a linha completa e depois selecionar manualmente as chaves em JS, perderá o benefício da restrição no nível do banco de dados e enviará colunas extras pela rede. Prefira restringir os dados na consulta.
Verificação Rápida
Confirme sua compreensão das formas inferidas dos resultados.
Recapitulação
O tipo do resultado é calculado a partir da seleção por meio de um tipo mapeado: seleções completas retornam a linha inteira, seleções parciais restringem o tipo às chaves escolhidas, renomeações alteram as chaves do resultado, a nulabilidade é propagada e as agregações carregam seus próprios tipos. O tipo estático sempre reflete o SQL que você realmente escreveu.
Perguntas Frequentes
A aula “Inferindo Estruturas de Resultados de Consultas” é grátis?
Sim — o texto completo de “Inferindo Estruturas de Resultados de Consultas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de TypeScript Academy, atualize para CoddyKit PRO. O curso de TypeScript Academy inclui 4 aulas no total.
O que vou aprender em “Inferindo Estruturas de Resultados de Consultas”?
Permita que o construtor de consultas infira o tipo da linha retornada. Você pratica TypeScript Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar TypeScript Academy?
Nenhuma experiência prévia é necessária. TypeScript Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Inferindo Estruturas de Resultados de Consultas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de TypeScript Academy?
Sim. Cada aula de TypeScript Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Mapeamento de Esquema para Tipo
- Construção de Consultas com Segurança de Tipos
- Inferindo Estruturas de Resultados de Consultas
- Relações e Junções com Tipos