Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
T выводится из объекта, K из массива ключей: для ["name", "age"] это "name" | "age". Тип результата Pick<T, K> раскрывается в { name: string; age: number }, и short.name теперь string. Поле admin в результат не попало, и обращение к нему будет ошибкой.
В решении осталось одно приведение: {} as Pick<T, K>. Оно здесь вынужденное. Пустой объект ещё не содержит нужных полей, и доказать компилятору, что после цикла они все появятся, нельзя: TypeScript не следит за тем, что делает цикл.
Важно, что это приведение локальное и честное: мы сами заполняем объект строчкой ниже. Сравни с obj as Record<string, unknown> в исходной версии, которое выбрасывало тип входных данных целиком.
result[key] имеет тип Pick<T, K>[K], а obj[key] имеет тип T[K]. Для K extends keyof T это одно и то же: Pick берёт поля как есть. Связь, которую мы строили в заданиях 5 и 6, работает и внутри реализации.
Тот же K extends keyof T, что и в нашей функции. Синтаксис [P in K] называется mapped type, его разберём в задании 20.