Как связать ключ объекта с типом значения через keyof?

Используйте два параметра типа: T для объекта и K extends keyof T для ключа; результат — T[K]. Так сохраняется связь конкретного ключа с типом значения.

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

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

Используйте два параметра типа: T для объекта и K extends keyof T для ключа; результат — T[K]. Так сохраняется связь конкретного ключа с типом значения.

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

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

Условие

Напишите TypeScript-функцию readField, которая принимает объект и существующий ключ, возвращая точный тип выбранного значения. Она должна работать и с {id:1,name:'A'}, и с {active:true}, запрещая readField({active:true}, 'name').

Ответ

Используйте два параметра типа: T для объекта и K extends keyof T для ключа; результат — T[K]. Так сохраняется связь конкретного ключа с типом значения.

function readField<T extends object, K extends keyof T>(obj: T, key: K): T[K] {
  return obj[key];
}
const name = readField({id: 1, name: 'A'}, 'name'); // string
const active = readField({active: true}, 'active'); // boolean

Параметр key:string был бы слишком широким, а возвращаемый any потерял бы проверку. Это статическая гарантия для типизированных значений; данные внешнего JSON всё равно требуют проверки во время выполнения.

Источник: www.typescriptlang.org.

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

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

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

Подробнее