Выбор ответа 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.

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

  1. Код скомпилируется и упадёт только при вызове с кругом
  2. Ничего: для круга функция просто вернёт undefined
  3. Ошибка компиляции в строке const _exhaustive: never = sправильный ответ
  4. Ошибка компиляции в объявлении объединения Shape

Разбор

В default попадают все варианты, которые не обработаны в case. Пока их нет, s там имеет тип never. После добавления круга в default окажется { kind: 'circle'; r: number }, а его нельзя присвоить в never: компилятор покажет ошибку ровно там, где нужно дописать обработку.

«Ничего» и «упадёт в рантайме» описывают код без этой проверки. В объявлении Shape ошибки нет.

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

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