Generic Components Componentes Genéricos

Última atualização: 2026-11-03

Generic Components Componentes Genéricos

Componentes genéricos deixam o tipo seguir os dados: uma função List<T> renderiza um array de strings com T=string e um array de objetos com T=User. Você escreve uma vez e todo tipo de elemento ganha inferência e dicas completas, que é a técnica central por trás de bibliotecas de UI reutilizáveis e wrappers da camada de dados. A lógica do componente para de se importar com o formato dos itens, então o mesmo código serve qualquer payload que o chamador entregar.

GrupoDados e Engenharia
TipoPadrão

ℹ️ Informação O editor transpila JSX para JavaScript e renderiza a UI real na sandbox; os componentes são montados automaticamente — sem render manual.

📝 Sintaxe

type ListProps<T> = {
  items: T[]
  renderItem: (item: T) => React.ReactNode   // the caller decides how to render
  keyOf?: (item: T) => string | number
}

function List<T>({ items, renderItem, keyOf }: ListProps<T>) {
  return (
    <ul>
      {items.map((it, i) => (
        <li key={keyOf ? keyOf(it) : i}>{renderItem(it)}</li>
      ))}
    </ul>
  )
}

// T is inferred automatically at the call site:
<List items={['a', 'b']} renderItem={s => s.toUpperCase()} />      // T = string
<List items={users} renderItem={u => u.name} keyOf={u => u.id} />   // T = User

Retorna:Sem valor de retorno; trata-se de um padrão de codificação, não de uma API chamável.

▶ Exemplo

O exemplo roda direto: renderiza automaticamente ao expandir e edições valem na hora.

Saída:

Três listas reutilizam o mesmo componente GenericList para renderizar strings, números e objetos — genéricos desacoplam a lógica do componente do tipo do elemento (demonstração JSX em tempo de execução, os tipos são inferidos na versão TypeScript).

💡 Pontos-chave

💡 Dica Restrinja um genérico com <T extends { id: number }>: o campo precisa existir e T mantém seu tipo concreto, o que é muito mais seguro que any.
ℹ️ Informação Componentes genéricos típicos: uma tabela Table<T>, um select Select<T> e uma camada de API onde request<T>() retorna Promise<T>.
⚠️ Aviso O genérico <T> de uma arrow function é interpretado como uma tag JSX, então escreva <T,> com vírgula final ou use uma declaração de função em vez disso.
Mais casos em breve.

📚 Tutoriais Relacionados

❓ Perguntas Frequentes

P Em qual etapa o tipo de um componente genérico é determinado?
R No local da chamada. Passe items={['a']} e o TypeScript fixa T como string, então os parâmetros e o tipo de retorno de renderItem são verificados contra ele dali em diante.
P Qual a diferença real em relação a any?
R any desiste da verificação e perde dicas nas duas pontas, enquanto um genérico mantém a relação "desconhecido, mas consistente": o tipo que você passa é o tipo que sai.
P Quando realmente preciso de um componente genérico?
R Na maioria das vezes em bibliotecas de UI reutilizáveis (tabelas, formulários, seletores) e em wrappers da camada de dados; um componente que você escreve duas vezes e descarta não precisa ser genérico.
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%