Relações e Junções com Tipos
Modele relações para que os resultados de junções tenham os tipos corretos.
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 objectSelecionando 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.
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
- 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