Как сделать, чтобы тип аргумента совпадал с типом передаваемого ключа?

Для того чтобы тип аргумента совпадал с типом передаваемого ключа в TypeScript, можно использовать конструкцию keyof в сочетании с параметрами типа (generics) и typeof. Это позволяет определить тип аргумента на основе переданного ключа в объекте.

Вот пример реализации:

function getValueByKey<T, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}

В этом примере мы используем два параметра типа: T для типа объекта и K для ключа. Ключ (параметр K) должен быть одним из ключей объекта (определенных как keyof T), чтобы тип аргумента совпадал с типом передаваемого ключа.

Функция getValueByKey принимает объект obj и ключ key, и возвращает значение, соответствующее передаваемому ключу. Тип возвращаемого значения (T[K]) будет совпадать с типом значения, связанного с переданным ключом.

Вот пример использования:

interface MyObject {
  name: string;
  age: number;
  isValid: boolean;
}

const obj: MyObject = {
  name: "John",
  age: 30,
  isValid: true,
};

const name: string = getValueByKey(obj, "name"); // возвращает значение "John" типа string
const age: number = getValueByKey(obj, "age"); // возвращает значение 30 типа number
const isValid: boolean = getValueByKey(obj, "isValid"); // возвращает значение true типа boolean

Здесь мы определяем интерфейс MyObject, который имеет три свойства: name типа string, age типа number и isValid типа boolean. Затем мы создаем объект obj на основе этого интерфейса.

Затем мы вызываем функцию getValueByKey с объектом obj и ключом "name", "age" и "isValid", и присваиваем возвращаемые значения переменным name, age и isValid соответственно. Таким образом, тип аргумента будет совпадать с типом передаваемого ключа в каждом случае.

Результат: теперь у нас есть функция, которая позволяет нам получить значение из объекта, используя типизированный ключ. Это обеспечивает типовую безопасность и удобство при разработке на TypeScript.