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.
| 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
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 | undefined | Retorno 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.
🏷️ Genéricos Relacionados
💡 Casos relacionados
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.