Выбор ответа Junior Утилитарные типы спрашивают часто обновлено

Partial не глубокий

Вопрос

Что скажет компилятор?

type Profile = { name: string; address: { city: string } };
const p: Partial<Profile> = { address: {} };

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

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

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

Коротко

Правильный ответ: Ошибка: в address нет обязательного поля city. Partial это mapped-тип верхнего уровня: { [K in keyof T]?: T[K] }.

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

  1. Ошибка: поле address обязательно
  2. Всё компилируется, но address получает тип any
  3. Всё компилируется: Partial делает необязательными все поля на любой глубине
  4. Ошибка: в address нет обязательного поля cityправильный ответ

Разбор

Partial это mapped-тип верхнего уровня: { [K in keyof T]?: T[K] }. Само поле address стало необязательным, но его тип остался { city: string }, где city обязателен. Пустой объект в address не проходит.

Для вложенных объектов нужен рекурсивный DeepPartial, его во встроенных утилитах нет. Поле address необязательно, и any тут не появляется.

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

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