0Pricing
TypeScript Academy · Aula

Uniões discriminadas para correspondência segura de padrões

Adicione um campo literal comum aos membros da união para garantir a segurança dos tipos

Uniões discriminadas para correspondência segura de padrões é 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.

Boas-vindas

As uniões discriminadas adicionam uma propriedade literal compartilhada aos membros da união. TypeScript usa esse discriminador para refinar o tipo em instruções switch e if.

A propriedade discriminadora

Um discriminador é uma propriedade com um tipo literal exclusivo em cada membro da união. TypeScript refina a união com base no valor dessa propriedade.
type Circle = { kind: 'circle'; radius: number };
type Square = { kind: 'square'; side: number };
type Shape = Circle | Square;

Refinamento com verificações if

Verifique o discriminador em uma instrução if. TypeScript refina o tipo para o membro correspondente.
function area(shape: Shape): number {
  if (shape.kind === 'circle') {
    return Math.PI * shape.radius ** 2;
  }
  return shape.side ** 2; // narrowed to Square
}

Refinamento com switch/case

As instruções switch funcionam perfeitamente com uniões discriminadas. Cada case refina o tipo para um membro específico.
function describe(shape: Shape): string {
  switch (shape.kind) {
    case 'circle': return `Circle r=${shape.radius}`;
    case 'square': return `Square s=${shape.side}`;
  }
}

Exaustividade com never

Adicione um caso padrão que atribua o valor a `never`. Se adicionar um novo membro à união e esquecer de tratá-lo, TypeScript informará um erro.
function area(shape: Shape): number {
  switch (shape.kind) {
    case 'circle': return Math.PI * shape.radius ** 2;
    case 'square': return shape.side ** 2;
    default:
      const _exhaustive: never = shape;
      throw new Error('Unhandled shape');
  }
}

Padrão de tipo Resultado

As uniões discriminadas são perfeitas para o padrão Resultado: retornar dados de sucesso ou um erro sem lançar uma exceção.
type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
type Result<T> = Ok<T> | Err;

Padrão de tipo de ação (no estilo Redux)

No Redux e em sistemas semelhantes, as ações são uniões discriminadas. O campo `type` é o discriminador.
type Action =
  | { type: 'INCREMENT'; amount: number }
  | { type: 'DECREMENT'; amount: number }
  | { type: 'RESET' };

Várias propriedades discriminadoras

Um discriminador não precisa ser uma única propriedade: TypeScript pode refinar o tipo com base em qualquer combinação de verificações.
type AdminUser = { role: 'admin'; permissions: string[] };
type RegularUser = { role: 'user'; credits: number };
type User = AdminUser | RegularUser;

Uniões não discriminadas também podem ser refinadas

Mesmo sem um discriminador, TypeScript refina as uniões usando typeof, instanceof e verificações de propriedades.
type StringOrArr = string | string[];
function flatten(val: StringOrArr): string[] {
  return Array.isArray(val) ? val : [val];
}

Uniões discriminadas versus hierarquias de classes

As uniões discriminadas são uma alternativa funcional à herança de classes para modelar variantes. Elas são mais simples, serializáveis e funcionam bem com correspondência de padrões.

Exemplo real: união de respostas HTTP

Modele diferentes estados de resposta de uma API como uma união discriminada.
type ApiState<T> =
  | { status: 'loading' }
  | { status: 'success'; data: T }
  | { status: 'error'; message: string };

Verificação rápida

O que cada membro de uma união discriminada deve ter para que TypeScript faça o refinamento corretamente?

Recapitulação

As uniões discriminadas usam uma propriedade literal compartilhada como discriminador. Faça o refinamento com switch/case e adicione uma verificação de exaustividade com never para detectar casos não tratados. Elas são ideais para máquinas de estados, ações e respostas de APIs.

Perguntas Frequentes

A aula “Uniões discriminadas para correspondência segura de padrões” é grátis?

Sim — o texto completo de “Uniões discriminadas para correspondência segura de padrões” é 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 “Uniões discriminadas para correspondência segura de padrões”?

Adicione um campo literal comum aos membros da união para garantir a segurança dos tipos 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 “Uniões discriminadas para correspondência segura de padrões”?

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. Tipos união: A ou B
  2. Tipos interseção: A e B
  3. Uniões discriminadas para correspondência segura de padrões
  4. Padrões práticos com uniões e interseções
← Voltar para TypeScript Academy