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

Почему нельзя вернуть объект как T

Вопрос

Почему функция не компилируется?

function make<T extends { id: number }>(): T {
  return { id: 1 };
}

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

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

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

Коротко

Правильный ответ: T может быть подтипом с лишними полями, а { id: 1 } их не содержит. Ограничение задаёт нижнюю планку: T может быть { id: number; name: string }.

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

  1. Нужно писать T extends object, иначе объектный литерал не подходит
  2. T нельзя использовать в возвращаемом типе без аргумента того же типа
  3. T может быть подтипом с лишними полями, а { id: 1 } их не содержитправильный ответ
  4. Литерал 1 не совместим с number без явного as number в объекте

Разбор

Ограничение задаёт нижнюю планку: T может быть { id: number; name: string }. Вызывающий, написав make<{ id: number; name: string }>(), ждёт объект с name, а функция вернёт только id. Поэтому { id: number } нельзя присвоить в T.

Возвращать T без аргумента синтаксически можно, просто вывести его будет не из чего. Литерал 1 совместим с number. object проблемы не решает. Правильно вернуть тип { id: number }, а не T.

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

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

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