Пример
class Animal { legs = 4 }
class Dog extends Animal { bark() {} }
const dogs: Dog[] = [new Dog()];
const animals: Animal[] = dogs;
animals.push(new Animal());
dogs[1].bark();
type Listener = (e: MouseEvent) => void;
const broad = (e: Event) => {};
const l: Listener = broad;
type Narrow = (e: MouseEvent) => void;
const wide: (e: Event) => void = (e: MouseEvent) => e.button;
Итог
Covariant arrays + mutable push = classic runtime hole; contravariant handlers — counterintuitive but safe direction.