Типобезопасный доступ к свойствам объекта через функцию

Задайте два generic-параметра: T для объекта и K extends keyof T для ключа. Возвращаемый тип T[K] сохранит точный тип выбранного свойства.

Короткий ответ

Что ответить на собеседовании

Задайте два generic-параметра: T для объекта и K extends keyof T для ключа. Возвращаемый тип T[K] сохранит точный тип выбранного свойства.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо создать функцию, которая получает объект и строковый ключ, при этом на этапе компиляции должна проверяться принадлежность ключа этому объекту. При попытке вызвать функцию с несуществующим в объекте ключом компилятор должен выдавать ошибку.

const X = { a: 1, b: 2, c: 3, d: 4 };

function getProperty(obj, key) {
  return obj[key];
}

getProperty(X, 'a');
getProperty(X, 'm'); //error

Ответ

Задайте два generic-параметра: T для объекта и K extends keyof T для ключа. Возвращаемый тип T[K] сохранит точный тип выбранного свойства.

function getProperty<T extends object, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}
getProperty(X, 'a'); // number
// getProperty(X, 'm'); // ошибка TypeScript

Если допускаются только строковые ключи, ограничьте K через Extract<keyof T, string>. Проверка существует на этапе компиляции и не валидирует входные данные из сети. Использование any или небезопасного приведения типа способно обойти этот контракт.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее