Alexandroppolus
@Alexandroppolus
кодир

Как Array это делает?

Как массив остается ковариантным? Интерфейс 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 { ... }
  • Вопрос задан
  • 159 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы