Выбор ответа Middle Дженерики обновлено
Почему нельзя вернуть объект как T
Вопрос
Почему функция не компилируется?
function make<T extends { id: number }>(): T {
return { id: 1 };
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: T может быть подтипом с лишними полями, а { id: 1 } их не содержит. Ограничение задаёт нижнюю планку: T может быть { id: number; name: string }.
Варианты ответа
- Нужно писать
T extends object, иначе объектный литерал не подходит Tнельзя использовать в возвращаемом типе без аргумента того же типаTможет быть подтипом с лишними полями, а{ id: 1 }их не содержитправильный ответ- Литерал
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 ошибок.