В TypeScript можно ограничить вводимые ключи объекта в функцию, используя индексные типы и оператор keyof.
Для начала рассмотрим пример, где у нас есть функция, которая принимает объект и произвольный ключ объекта:
function getProperty(obj: object, key: string) { return obj[key]; }
В данном случае, функция getProperty принимает объект типа object и произвольный ключ типа string. Однако, она не гарантирует, что ключ, переданный в функцию, существует у объекта или имеет правильный тип значения.
Чтобы ограничить вводимые ключи объекта по нужному типу, мы можем использовать индексные типы и оператор keyof:
function getProperty<T extends object, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; }
В этом примере мы использовали два новых типа: T и K. Тип T ограничивает объект, переданный в функцию, типом object или его подтипом. Тип K ограничивает ключ, переданный в функцию, типом keyof T (т.е. ключами, которые существуют у объекта T).
Далее мы используем эти типы в сигнатуре функции: getProperty принимает объект типа T и ключ типа K, а возвращает значение с типом T[K].
Теперь, если мы вызовем эту функцию, передав неверный ключ или ключ типом, который не существует у объекта, TypeScript выдаст ошибку:
const obj = { name: 'John', age: 25 }; const name = getProperty(obj, 'name'); // тип name будет string const age = getProperty(obj, 'age'); // тип age будет number const wrongKey = getProperty(obj, 'email'); // ошибка: ключ 'email' не существует у объекта obj
Таким образом, мы можем ограничить вводимые ключи объекта функцией по нужному типу, используя индексные типы и оператор keyof. Это помогает предотвратить ошибки во время компиляции и обеспечивает типобезопасность в коде.