Вопрос проверяет умение использовать ограничения generic-параметров для построения типобезопасных API.
Generic ограничивают ключами объекта с помощью конструкции K extends keyof T. Это гарантирует, что K может быть только одним из ключей объекта T. Такой подход позволяет связать тип ключа с типом возвращаемого значения и получить точную типизацию. Это базовый и самый распространённый паттерн в TypeScript.
Ограничение generic — это способ сказать компилятору, какие значения допустимы.
Generic constraint — ограничение на параметр типа с помощью extends.
function getValue<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
T — тип объекта.
K — тип ключа.
K extends keyof T — ключ может быть только существующим.
T[K] — тип значения зависит от ключа.
const settings = {
theme: "dark",
retry: 3,
};
getValue(settings, "theme"); // string
getValue(settings, "retry"); // number
getValue(settings, "url"); // ошибка
Защита от опечаток.
Корректные типы без as.
Улучшенное автодополнение.
Безопасные универсальные утилиты.
function setValue<T, K extends keyof T>(
obj: T,
key: K,
value: T[K]
) {
obj[key] = value;
}
setValue(settings, "retry", 5); // ok
setValue(settings, "retry", "5"); // ошибка
Ограничение generic через K extends keyof T — фундаментальный приём TypeScript для построения строгих и безопасных API при работе с объектами.