Выбор ответа Middle Дженерики обновлено

Вывод T из двух аргументов

Вопрос

Что произойдёт?

function same<T>(a: T, b: T) {}
same(1, 'a');

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ошибка на аргументе 'a': string нельзя присвоить в number. Когда кандидаты для T (number и string) не имеют общего супертипа среди себя, TypeScript не склеивает их в объединение, а берёт первый подходящий кандидат: number.

Варианты ответа

  1. Компилируется, а T выводится как unknown из двух кандидатов
  2. Ошибка на аргументе 1: number нельзя присвоить в string
  3. Компилируется, а T выводится как объединение string | number
  4. Ошибка на аргументе 'a': string нельзя присвоить в numberправильный ответ

Разбор

Когда кандидаты для T (number и string) не имеют общего супертипа среди себя, TypeScript не склеивает их в объединение, а берёт первый подходящий кандидат: number. Второй аргумент проверяется против него и даёт ошибку. Так компилятор ловит случайную передачу разных типов туда, где ожидаются одинаковые.

Если объединение действительно нужно, его указывают явно: same<string | number>(1, 'a').

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме