Используйте два параметра типа: T для объекта и K extends keyof T для ключа; результат — T[K]. Так сохраняется связь конкретного ключа с типом значения.
Как связать ключ объекта с типом значения через keyof?
Используйте два параметра типа: 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.