Как массив остается ковариантным? Интерфейс Array какой-то особенный?
// Добавим сюда два метода для надежности. Теперь они есть в типизации всех массивов
interface Array<T> {
f1: () => T;
f2: (v: T) => void;
}
// теперь из-за f2 массив должен стать инвариантным, но не стал:
type Array1ExtendsArray12 = Array<1> extends Array<1 | 2> ? true : false; // true (вот здесь)
type Array12ExtendsArray1 = Array<1 | 2> extends Array<1> ? true : false; // false
// обычный интерфейс получается инвариантным:
interface Preved<T> {
[n: number]: T;
push(x: T): void;
}
interface Preved<T> {
f1: () => T;
f2: (v: T) => void;
}
type Preved1ExtendsPreved12 = Preved<1> extends Preved<1 | 2> ? true : false; // false
type Preved12ExtendsPreved1 = Preved<1 | 2> extends Preved<1> ? true : false; // false
Playground
примечание: если смотреть пример в VSCode, то добавление методов в Array надо обернуть declare global { ... }