Variace popisuje, jak se vztah podtypů složeného typu vztahuje na podtypy jeho částí — tj. kdy je Container<Sub> přiřaditelné na Container<Super>?
Nechť Dog je podtyp Animal.
let dogs: Dog[] = [];
let animals: Animal[] = dogs; // ✅ Dog[] is assignable to Animal[]
Návratové typy a pole jsou kovariantní: pokud Dog ⊆ Animal, pak Dog[] ⊆ Animal[]. Funkce vracející Dog je použitelná tam, kde se očekává ta, která vrací Animal.
type Handler<T> = (arg: T) => void;
let animalHandler: Handler<Animal> = (a) => {};
let dogHandler: Handler<Dog> = animalHandler; // ✅ (with strictFunctionTypes)
// a handler that accepts ANY Animal can safely handle a Dog
Parametry funkce jsou kontravariační: Handler<Animal> je přiřaditelné na Handler<Dog>, což je opak vztahu prvků. To je korektní — něco, co zpracovává všechna zvířata, určitě zpracovává psy.
// Method parameters in TS are bivariant by default (a known unsound convenience)
interface Comparer<T> { compare(a: T): void; }
TypeScript kontroluje samostatné typy funkcí kontravariačně pouze pod strictFunctionTypes; parametry metod jsou záměrně bivariační z důvodů ergonomie, což je technicky nezabezpečené.
Variace vysvětluje, proč jsou určitá přiřazení povolena nebo zamítnuta — proč Dog[] pasuje na Animal[], ale callback (d: Dog) => void nemusí být schopen nahradit (a: Animal) => void.
Knihovna IT otázek k pohovoru s podrobnými odpověďmi — od Junior po Senior.
Přispět