T extends U Restrições genéricas
Última atualização: 2026-10-22
T extends U Restrições genéricas
Uma restrição (extends) delimita um parâmetro de tipo: <T extends HasId> promete "T tem pelo menos id: number". Dentro da restrição você pode acessar livremente os membros de T; fora dela (passar uma string) é rejeitado em tempo de compilação — mais seguro que any, mais flexível que um tipo concreto.
| 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
interface HasId {
id: number;
}
function findById<T extends HasId>(items: T[], id: number): T | undefined {
return items.find((item) => item.id === id);
}
⚙️ Parâmetros
| T extends HasId | A restrição: o tipo do argumento deve ser compatível com HasId (pelo menos id: number) |
|---|---|
| T | undefined | O retorno mantém a forma exata do argumento: o que entra é o que volta |
Retorno:Igual aos genéricos sem restrição — o tipo preciso do argumento é preservado; a diferença é que mais membros de T tornam-se utilizáveis dentro do corpo.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
Desk
não encontrado
(Saída de execução após a transpilação; campos extras nos products não são problema — a tipagem estrutural só verifica os membros exigidos pela restrição)
💡 Observações
ℹ️ Info Uma restrição não exige igualdade: { id: 1, name: "Lamp", price: 59 } continua compatível apesar dos campos extras — a tipagem estrutural só verifica os membros exigidos.
💡 Dica Restrições inline dispensam a interface intermediária: function sumLengths<T extends { length: number }>(a: T, b: T) diz "qualquer coisa com length"; promova a uma interface só quando ficar complexa.
⚠️ Atenção Uma restrição é um piso: T extends HasId garante apenas id; item.name continua desconhecido para o compilador, a menos que você também o restrinja.
🏷️ Genéricos Relacionados
💡 Casos relacionados
Mais casos em breve.
📚 Tutoriais relacionados
❓ Perguntas frequentes
P Restrições e padrões podem ser combinados?
R Sim, é comum: <T extends HasId = User> — User por padrão, qualquer tipo compatível com HasId quando fornecido. O padrão deve satisfazer a restrição.
P Como restringir a alguns valores literais?
R Com uma união de literais: function set<K extends "light" | "dark">(theme: K). K se estreita aos literais; qualquer outra coisa é erro de compilação.
P Como parâmetros de tipo se restringem entre si?
R Referencie um anterior: <K extends keyof T> — o intervalo de K é determinado por T, o cerne do padrão keyof que mantém as chaves casadas com o objeto real.