ExpertiDict

TypeScript · Avançado · Português · Técnico

variância

/vaɾiˈɐ̃sjɐ/substantivo feminino

Regra de como a compatibilidade de tipos compostos acompanha a dos seus componentes: covariante segue o sentido, contravariante inverte, invariante exige igualdade.

Onde usar

Explica por que Array<Gato> pode ser usado como Array<Animal> e por que callbacks com parâmetro mais específico são recusados sob strictFunctionTypes. Surge ao projetar tipos genéricos.

Em código

class Animal { nome = ''; }
class Gato extends Animal { mia() {} }
const gatos: Gato[] = [new Gato()];
const animais: Animal[] = gatos; // covariante
type Fa = (a: Animal) => void;
type Fg = (g: Gato) => void;
const f: Fa = (a) => {};
const g: Fg = f; // contravariante: ok

Exemplos

A variância do parâmetro decide se esse genérico aceita o subtipo.

Callback é contravariante no parâmetro, por isso o erro.

Cuidado

Não confunda variância com herança: ela descreve como Box<Gato> se relaciona com Box<Animal>, e a resposta depende de o parâmetro ser lido, escrito ou ambos.

Sinônimos

variance, covariância e contravariância

Antônimos

invariância

Veja também

Todos os termos de TypeScript