Выбор ответа Middle Объединения и сужение спрашивают часто обновлено
Новый вариант в объединении
Вопрос
В тип Shape добавили | { kind: 'circle'; r: number }, а функцию area не тронули. Что произойдёт?
type Shape =
| { kind: 'square'; size: number }
| { kind: 'rect'; w: number; h: number };
function area(s: Shape): number {
switch (s.kind) {
case 'square': return s.size ** 2;
case 'rect': return s.w * s.h;
default: {
const _exhaustive: never = s;
throw new Error('unknown shape');
}
}
}
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ошибка компиляции в строке const exhaustive: never = s. В default попадают все варианты, которые не обработаны в case.
Варианты ответа
- Код скомпилируется и упадёт только при вызове с кругом
- Ничего: для круга функция просто вернёт
undefined - Ошибка компиляции в строке
const _exhaustive: never = sправильный ответ - Ошибка компиляции в объявлении объединения
Shape
Разбор
В default попадают все варианты, которые не обработаны в case. Пока их нет, s там имеет тип never. После добавления круга в default окажется { kind: 'circle'; r: number }, а его нельзя присвоить в never: компилятор покажет ошибку ровно там, где нужно дописать обработку.
«Ничего» и «упадёт в рантайме» описывают код без этой проверки. В объявлении Shape ошибки нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.