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.

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

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 HasIdA restrição: o tipo do argumento deve ser compatível com HasId (pelo menos id: number)
T | undefinedO 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.
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.
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%