T extends U ? X : Y Tipos condicionais

Última atualização: 2026-10-22

T extends U ? X : Y Tipos condicionais

Tipos condicionais fazem os tipos responderem uma prova: T extends U ? X : Y — escolha X se a condição vale, Y caso contrário. Eles movem o ternário de execução para o nível de tipos e, combinados com genéricos, produzem tipos de retorno que se adaptam à entrada.

GrupoGenéricos
TipoSintaxe
Modo strictNã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 Wrapped<T> = T extends string
  ? { kind: "str"; value: T }
  : { kind: "num"; value: number };

type A = Wrapped<string>;  // { kind: "str"; value: string }
type B = Wrapped<number>;  // { kind: "num"; value: number }

// Uniões se distribuem na checagem (um condicional distributivo)
type ToArray<T> = T extends unknown ? T[] : never;

⚙️ Parâmetros

T extends UA condição: se estruturalmente compatível, tome o ramo verdadeiro
? X : YOs dois ramos: expressões de tipo completas, podem aninhar mais condicionais

Retorno:Tipos condicionais são computação pura no nível de tipos, sem código em execução; o resultado depende de o argumento genérico satisfazer o extends.

▶ Exemplo

Edite o código abaixo e clique em Testar para ver o resultado transpilado:

Saída:

{"kind":"str","value":"hi"}
{"kind":"num","value":7}

(Saída de execução após a transpilação; wrap(true) gera um erro de compilação — nenhuma sobrecarga aceita boolean)

💡 Observações

ℹ️ Info Um parâmetro de tipo nu se distribui sobre uniões: ToArray<string | number> é string[] | number[], e não (string | number)[] — o condicional distributivo, que também é como Exclude é implementado.
💡 Dica never é o sinal de "filtrar fora": type NonNull<T> = T extends null | undefined ? never : T elimina os membros null/undefined após a distribuição.
⚠️ Atenção A legibilidade despenca além de três níveis de aninhamento: prefira tipos mapeados ou acesso indexado quando possível, e quebre aninhamentos profundos em aliases de type intermediários.
Mais casos em breve.

📚 Tutoriais relacionados

❓ Perguntas frequentes

P Tipos condicionais ou sobrecargas?
R Um ou dois ramos simples → uma única assinatura com tipo condicional; muitos ramos ou precisão de literais → sobrecargas. Eles se misturam bem (como o exemplo mostra).
P Por que T extends string também "vale" para string | number?
R A distribuição está em ação: a união é dividida, verificada membro a membro e depois combinada. Para testar a união como um todo, envolva em tuplas: [T] extends [string].
P Tipos condicionais podem ser usados em parâmetros?
R Sim, mas com cuidado: condicionais em posições de parâmetro tornam a inferência de quem chama sutil; o padrão comum são parâmetros genéricos com um tipo de retorno condicional.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%