Как ограничить вводимые ключи объекта в функцию по нужному типу T[keyof T]?

В 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. Это помогает предотвратить ошибки во время компиляции и обеспечивает типобезопасность в коде.