Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
Partial<User> разворачивается в { name?: string; email?: string }, поэтому объект с одним email проходит проверку, как и пустой объект, и объект с обоими полями.
Главное преимущество перед ручной копией в том, что тип производный. Добавили в User поле age, и UserPatch немедленно узнал про него сам. Ручной дубликат пришлось бы править отдельно, и однажды про него бы забыли.
Это обычный тип из стандартной библиотеки, и его можно прочитать:
Конструкция называется mapped type: пройти по всем ключам T (keyof T) и переобъявить каждое поле с тем же типом, добавив ?. Разбираться в этом прямо сейчас не обязательно, но полезно знать, что никакой магии в утилитах нет, они написаны на том же TypeScript.
Функция обновления, которая принимает только изменившиеся поля:
Обрати внимание на вторую строку: Partial делает поля необязательными, но не разрешает произвольные. Набор ключей остаётся тем же.
Есть и противоположная операция, Required<T>, она снимает вопросительные знаки со всех полей. Пара Partial и Required часто встречается там, где один и тот же объект проходит путь от черновика до полностью заполненной записи.