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

Ограничение extends

Вопрос

Какой вызов не скомпилируется?

function longest<T extends { length: number }>(a: T, b: T): T {
  return a.length >= b.length ? a : b;
}

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

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

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

Коротко

Правильный ответ: longest(10, 20). T extends { length: number } требует от аргумента числового поля length.

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

  1. longest(10, 20)правильный ответ
  2. longest({ length: 1 }, { length: 2 })
  3. longest('abc', 'de')
  4. longest([1], [2, 3])

Разбор

T extends { length: number } требует от аргумента числового поля length. У строк, массивов и объекта { length: 1 } оно есть, у числа нет, поэтому longest(10, 20) даёт ошибку.

Объект с полем length подходит благодаря структурной типизации, и это частая ловушка: кандидаты думают, что ограничение пропускает только массивы и строки.

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

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

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