in / out Variância (covariância e contravariância)
Última atualização: 2026-10-22
in / out Variância (covariância e contravariância)
A variância descreve como um parâmetro de tipo dentro de um tipo composto afeta a compatibilidade geral: retornos são covariantes (subtipos substituem), parâmetros são contravariantes (funções que aceitam supertipos substituem). Atribuibilidade de funções e compatibilidade de interfaces aninhadas seguem tudo isso — uma vez compreendida, "por que esta atribuição dá erro ou não" tem uma resposta sistemática.
| 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
// TS 4.7+ permite anotações de variância explícitas (por padrão, inferidas estruturalmente)
interface Producer<out T> { produce(): T; } // covariante: apenas produz T
interface Consumer<in T> { consume(v: T): void; } // contravariante: apenas consome T
// As regras naturais da atribuição de funções
let handleDog: (d: Dog) => void = handleAnimal; // OK: contravariância de parâmetro
const adoptAnimal: (tag: string) => Animal = adoptDog; // OK: covariância de retorno
⚙️ Parâmetros
| <out T> | T aparece apenas em posições de saída (retornos): Producer<Dog> pode servir como Producer<Animal> |
|---|---|
| <in T> | T aparece apenas em posições de entrada (parâmetros): Consumer<Animal> pode servir como Consumer<Dog> |
| <in out T> | Leitura e escrita ambas expostas: tipos estritamente idênticos exigidos, senão incompatível |
Retorno:A variância é uma regra de compatibilidade sem código em execução; ela decide apenas "o que pode ser atribuído a quê".
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
Rex eats food
Rex-A1 eats food
(Saída de execução após a transpilação; o inverso não vale — atribuir uma função que só trata Dog ao espaço (a: Animal) => void é rejeitado pelo compilador, que é justamente a contravariância de parâmetros barrando uma atribuição insegura)