Выбор ответа Middle Базовые типы обновлено

Проверка лишних свойств

Вопрос

Какой вызов даст ошибку компиляции?

type Opts = { url: string };
function req(o: Opts) {}

const o = { url: '/a', retry: 3 };
req(o);                         // A
req({ url: '/a', retry: 3 });   // B

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

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

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

Коротко

Правильный ответ: Только B. Структурная типизация разрешает лишние поля: объект o подходит под Opts, потому что url у него есть (A компилируется).

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

  1. Никакой: лишние поля в TypeScript разрешены всегда
  2. Только A
  3. Только Bправильный ответ
  4. Оба

Разбор

Структурная типизация разрешает лишние поля: объект o подходит под Opts, потому что url у него есть (A компилируется). Но для свежего объектного литерала, переданного прямо туда, где ожидается тип, TypeScript включает проверку лишних свойств: retry там почти наверняка опечатка или ошибка, поэтому B не компилируется.

«Оба» неверно, потому что для переменной проверка не срабатывает. «Никакой» неверно, потому что для литералов проверка есть.

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

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