0Pricing
TypeScript Academy · Aula

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 } | undefined

As 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

  1. Mapeamento de Esquema para Tipo
  2. Construção de Consultas com Segurança de Tipos
  3. Inferindo Estruturas de Resultados de Consultas
  4. Relações e Junções com Tipos
← Voltar para TypeScript Academy