Код Middle Утилитарные типы обновлено

PATCH только разрешённых полей

Условие

Напиши sanitizePatch<T, K extends keyof T>(patch: unknown, allowed: readonly K[]): Partial<Pick<T, K>>: из произвольного тела запроса берёт только ключи из allowed (если тело не объект, возвращает {}). Значения проверяет вызывающий код.

applyProfilePatch(profile, body) в заготовке разрешает менять только name и bio, проверяет, что это строки, и применяет патч. Попытка поменять role или id молча игнорируется.

Примеры

applyProfilePatch({"id":1,"name":"Аня","bio":"","role":"user"}, {"name":"Анна","bio":"Бэкенд"}) // {"id":1,"name":"Анна","bio":"Бэкенд","role":"user"}
applyProfilePatch({"id":1,"name":"Аня","bio":"","role":"user"}, {"role":"admin","id":99}) // {"id":1,"name":"Аня","bio":"","role":"user"}
applyProfilePatch({"id":1,"name":"Аня","bio":"x","role":"user"}, "name=hack") // {"id":1,"name":"Аня","bio":"x","role":"user"}

Как подойти

Подсказки: 2
  1. Тип результата Partial<Pick<T, K>>: только разрешённые ключи и каждый необязателен.
  2. Значения внутри unknown, поэтому присваивание в out требует локального приведения.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.