infer A palavra-chave infer
Última atualização: 2026-10-22
infer A palavra-chave infer
infer captura um tipo dentro do ramo verdadeiro de um condicional: T extends Array<infer U> ? U : never significa "se T é um array, extraia o tipo dos seus elementos como U". Ela eleva o casamento de "casar e descartar" para "casar e extrair" — o cerne de utilitários como ReturnType.
| Grupo | Genéricos |
|---|---|
| Tipo | Operador |
| 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 ItemOf<T> = T extends Array<infer U> ? U : never;
type A = ItemOf<string[]>; // string
type B = ItemOf<number[]>; // number
// infer pode aparecer em qualquer posição do padrão
type FirstArg<T> = T extends (first: infer A, ...rest: any[]) => any ? A : never;
⚙️ Parâmetros
| infer U | Uma declaração de placeholder: durante o casamento do extends, o tipo naquela posição é capturado como U |
|---|---|
| T extends X ? U : Y | Válido apenas dentro do ramo verdadeiro do condicional atual; invisível fora dele |
Retorno:infer não é um tipo, mas uma ligação feita durante o casamento; o resultado do condicional é calculado a partir do que foi capturado.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
11 A
(Saída de execução após a transpilação; n e s são number e string em tempo de compilação — infer extraiu os tipos dos elementos)
💡 Observações
ℹ️ Info infer pode aparecer em qualquer lugar do padrão do extends: Promise<infer U> agarra o tipo do resolve, [any, infer R] o segundo slot da tupla, (x: infer P) => any o parâmetro — a posição é o significado.
💡 Dica infer de mesmo nome repetido dispara a união de candidatos: [infer T, infer T] casa [number, number] como number, mas falha em [string, number] — uma verificação de consistência natural.
⚠️ Atenção infer só é legal dentro da cláusula extends de um condicional — um type U = infer X solto é um erro de sintaxe, e U não pode ser referenciado no ramo falso.
🏷️ Genéricos Relacionados
💡 Casos relacionados
Mais casos em breve.
📚 Tutoriais relacionados
❓ Perguntas frequentes
P infer vs um parâmetro genérico <T>?
R Parâmetros genéricos são dados por quem chama; infer extrai de um tipo existente. Um declara entrada, o outro minera informação — ReturnType<T> infere um retorno de um tipo de função.
P O que acontece com U quando o casamento falha?
R Sem casamento, sem ligação — o fluxo simplesmente cai no ramo falso, que tipicamente produz never ou unknown como fallback.
P Quais utilitários embutidos usam infer?
R ReturnType, Parameters, ConstructorParameters, Awaited e mais — todas combinações de extends + infer; aprenda infer e a maior parte do código-fonte dos utility types se torna legível.