class<T> Classes genéricas

Última atualização: 2026-10-22

class<T> Classes genéricas

Uma classe genérica (class Stack<T>) liga a estrutura da classe ao tipo de dados armazenado: uma instância de Stack<number> só deixa números entrarem e saírem. Campos, parâmetros de métodos e retornos podem todos referenciar T — todo o estado permanece type-safe.

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

class Stack<T> {
  private items: T[] = [];
  push(item: T): void { this.items.push(item); }
  pop(): T | undefined { return this.items.pop(); }
  size(): number { return this.items.length; }
}

const numStack = new Stack<number>();

⚙️ Parâmetros

<T>Parâmetro de tipo no nível da classe: fixado por new Stack<number>() e compartilhado por toda a classe
pop(): T | undefinedRetorno referenciando T: estourar uma pilha vazia produz undefined, expresso honestamente no tipo

Retorno:Os retornos dos métodos são fixados pelo T da instância: o pop() de Stack<number> é number | undefined.

▶ Exemplo

Edite o código abaixo e clique em Testar para ver o resultado transpilado:

Saída:

2 1
build

(Saída de execução após a transpilação; numStack.push("1") gera um erro de compilação — o T desta instância está travado em number)

💡 Observações

ℹ️ Info T é uma única variável em toda a classe: o que entra com push é o que sai com pop — a diferença essencial em relação a um contêiner baseado em any.
💡 Dica Membros estáticos não podem referenciar o T da classe: static é no nível da classe, não da instância; dê aos métodos static seus próprios parâmetros de tipo, se necessário.
⚠️ Atenção Parâmetros de tipo valem no lado da instância: Stack<number> e Stack<string> são tipos incompatíveis — atribuir entre eles dá erro.
Mais casos em breve.

📚 Tutoriais relacionados

❓ Perguntas frequentes

P Posso escrever new Stack() sem <number>?
R Sim, quando os argumentos do construtor permitem inferência (new Stack([1, 2]) → Stack<number>); um construtor vazio produz Stack<unknown>, então ali prefira escrever explicitamente.
P Como estender uma classe genérica?
R Ou fixe T: class NumberStack extends Stack<number>; ou leve o seu: class Box<T> extends Stack<T> — o parâmetro do filho deve satisfazer o do pai.
P Classes genéricas e interfaces funcionam juntas?
R Extremamente comum: interface Repo<T> é o contrato, class MemoryRepo<T> implements Repo<T> é a implementação — ambos permanecem genéricos e a camada de negócio recebe tipos precisos.
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%