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.
| Grupo | Genéricos |
|---|---|
| Tipo | Sintaxe |
| 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 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 U | A condição: se estruturalmente compatível, tome o ramo verdadeiro |
|---|---|
| ? X : Y | Os 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.
🏷️ Genéricos Relacionados
💡 Casos relacionados
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.