TypeScript Academy · Aula

Relações e Junções com Tipos

Modele relações para que os resultados de junções tenham os tipos corretos.

Aula 4 de 413 etapas

Relações e Junções com Tipos é uma aula grátis de TypeScript Academy no CoddyKit. Esta é a aula 4 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.

Relações Tipadas e Resultados Aninhados

Esquemas reais têm relações: um usuário tem muitos posts, e uma publicação pertence a um usuário. Um ORM com segurança de tipos permite declarar essas relações e depois retorna resultados corretamente aninhados e tipados a partir de consultas relacionais.

Declarando Relações

Junto às tabelas, você define um objeto de relações que descreve como elas se conectam. Esses metadados alimentam tanto a geração do SQL quanto o tipo do resultado.

import { relations } from "drizzle-orm";

export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts),
}));

export const postsRelations = relations(posts, ({ one }) => ({
  author: one(users, {
    fields: [posts.authorId],
    references: [users.id],
  }),
}));

Uma Consulta Relacional

A API de consulta permite solicitar linhas relacionadas com with. O resultado aninha os dados relacionados sob o nome da relação.

const result = await db.query.users.findMany({
  with: { posts: true },
});
// result: (User & { posts: Post[] })[]

one versus muitos Molda o Tipo

Uma relação many produz um vetor; uma relação one produz um único objeto (ou nulo). O tipo aninhado corresponde à cardinalidade declarada.

const r = await db.query.posts.findMany({
  with: { author: true },
});
// r: (Post & { author: User })[]   // author is a single object

Selecionando Colunas Dentro das Relações

Você pode restringir tanto as linhas principais quanto as aninhadas. O tipo do resultado é restringido de forma independente em cada nível.

const r = await db.query.users.findMany({
  columns: { id: true, name: true },
  with: {
    posts: { columns: { title: true } },
  },
});
// r: { id: number; name: string; posts: { title: string }[] }[]

Junções Manuais com Colunas Tipadas

As junções de nível mais baixo também permanecem tipadas. O predicado da junção usa referências tipadas de colunas, e a seleção define a forma plana do resultado.

const rows = await db
  .select({ author: users.name, title: posts.title })
  .from(posts)
  .innerJoin(users, eq(users.id, posts.authorId));
// rows: { author: string; title: string }[]

LEFT JOIN Introduz Nulabilidade

Uma LEFT JOIN pode produzir linhas ausentes do lado direito, portanto as colunas unidas se tornam anuláveis no tipo do resultado. O ORM reflete isso automaticamente.

const rows = await db
  .select({ name: users.name, title: posts.title })
  .from(users)
  .leftJoin(posts, eq(posts.authorId, users.id));
// rows: { name: string; title: string | null }[]

Resultados Aninhados versus Planos

Consultas relacionais (findMany + with) fornecem objetos aninhados; junções manuais fornecem linhas planas. Escolha o formato aninhado quando quiser grafos de objetos e o formato plano quando quiser projeções tabulares.

Como o Aninhamento é Tipado

Os metadados das relações são lidos no nível dos tipos. O tipo da consulta combina a linha base com um objeto cujas chaves são as relações solicitadas, cada uma mapeada para um vetor ou tipo único conforme sua cardinalidade.

type WithPosts = User & { posts: Post[] };
// "many" -> Post[], "one" -> User (or User | null for optional)

Relações Profundamente Aninhadas

As relações são combináveis. Você pode solicitar uma relação de outra relação, e o tipo se aninha com a mesma profundidade, tudo inferido automaticamente.

await db.query.users.findMany({
  with: { posts: { with: { comments: true } } },
});
// User & { posts: (Post & { comments: Comment[] })[] }

Por Que Isso Importa

Tipar manualmente resultados de junções aninhados é propenso a erros e se distancia do esquema. Derivá-los das relações declaradas mantém o tipo do grafo de objetos e o SQL em sincronia, portanto renomear uma relação gera um erro de compilação, não uma surpresa em produção.

Verificação Rápida

Teste sua compreensão das relações tipadas e das junções.

Recapitulação

Você declarou relações e depois permitiu que o ORM produzisse resultados tipados e aninhados: many fornece vetores, one fornece objetos únicos, as seleções parciais restringem cada nível, as LEFT JOIN introduzem nulabilidade e as relações profundamente aninhadas são combináveis. Os metadados das relações orientam tanto o SQL quanto os tipos dos resultados, mantendo-os sincronizados.

Grátis para começar

Aprenda TypeScript com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
101
Aulas
352

Perguntas Frequentes

A aula “Relações e Junções com Tipos” é grátis?

Sim — o texto completo de “Relações e Junções com Tipos” é 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 “Relações e Junções com Tipos”?

Modele relações para que os resultados de junções tenham os tipos corretos. 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 4 de 4.

Quanto tempo leva a aula “Relações e Junções com Tipos”?

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