Задайте два 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 или небезопасного приведения типа способно обойти этот контракт.