Exclude<T, U> Exclude (com Extract)
Última atualização: 2026-10-22
Exclude<T, U> Exclude (com Extract)
Exclude<T, U> remove da união T os membros atribuíveis a U — tipicamente para aparar ramos de que não se precisa em uma união grande. Seu espelho Extract<T, U> mantém apenas os membros atribuíveis a U. Ambos se apoiam no comportamento distributivo dos tipos condicionais.
| Grupo | Tipos Utilitários |
|---|---|
| Tipo | Tipo |
| Modo strict | Não necessário |
ℹ️ Info O editor transpila TypeScript para JavaScript e o executa (sem verificação de tipos); veja a Saída de cada exemplo para o resultado da verificação.
📝 Sintaxe
type Exclude<T, U> = T extends U ? never : T;
type Extract<T, U> = T extends U ? T : never;
// Uso
type PassiveEvent = Exclude<EventType, "click" | "keydown">;
type Interactive = Extract<EventType, "click" | "keydown">;
⚙️ Parâmetros
| T | A união de origem; cada membro é testado pelo tipo condicional por vez (distributividade) |
|---|---|
| U | O filtro: membros atribuíveis a U são removidos (Exclude) ou mantidos (Extract) |
Retorno:Um novo tipo união: Exclude é a diferença T menos U; Extract é a interseção de T e U.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
focus | scroll | wheel
click | keydown
(Saída de execução após a transpilação; o efeito no nível de tipo: dar push de "click" em passiveEvents é um erro de compilação — Exclude já o removeu de PassiveEvent)
💡 Observações
ℹ️ Info Funciona por meio de tipos condicionais distributivos: quando T é uma união, T extends U é avaliado por membro e os resultados são recombinados. Um membro que corresponde a U se torna never (desaparecendo da união) — é assim que a "exclusão" é implementada.
⚠️ Atenção Essas ferramentas só fazem sentido em tipos união. Aplicá-las a um tipo de objeto não união não processa as propriedades uma a uma e contraria a intuição — use Omit/Pick para propriedades de objetos.
💡 Dica NonNullable<T> é simplesmente Exclude<T, null | undefined>. Sabendo disso, a sua compreensão de Exclude se transfere diretamente.
🏷️ Tipos Utilitários Relacionados
💡 Casos relacionados
Mais casos em breve.
📚 Tutoriais relacionados
❓ Perguntas frequentes
P Qual é a diferença entre Exclude e Omit?
R Exclude opera sobre membros de uniões; Omit opera sobre chaves de propriedades de objetos. O Omit na verdade é implementado via Exclude: Exclude<keyof T, K> apara as chaves antes do Pick. Um gerencia membros, o outro chaves.
P Por que "distributivo"? E se não distribuísse?
R Sem distribuição, T extends U compararia a união inteira "click"|"focus"|... de uma só vez com U, a consideraria não atribuível e não removeria nada. A distribuição testa cada membro individualmente — esse é o próprio mecanismo para filtrar membros de uniões.
P Exclude pode remover membros objeto de uma união?
R Sim, desde que o membro seja atribuível a U. Por exemplo, com type Shape = Circle | Square, Exclude<Shape, Square> descarta Square. O critério é sempre a atribuibilidade, não a igualdade literal.