keyof в поисках типаЖили были функции без типов. Среди них были такие,
как
prop, возвращающие поля из объекта.
const prop = (obj, key) => obj[key]
Когда наступило время раздора и хаоса и пришли типы, неопытные программисты часто ошибались в том, как организовать верный вывод типов таких функций, но для любого поля результат был
any. (и жили они без noImplicitAny)
const prop = (obj: {}, key: any) => obj[key]
const example = { meow: 'meow' }
prop(example, 'meow') // type: any
"Как так!", — восклицали они, — "Ведь мы видели, что по ключам всегда получаем тип!"
И были правы. В TypeScript существует поиск типов (
Lookup Types) , который и позволяет получить связанный с ключем тип.Тогда к ним пришел важный тип и дал новое магическое слово -
keyof.Оно давало особую способность проникать в публичные имена ключей типов и создавать литеральный объединенный тип (
Union).*
const example = { meow: 'meow', murr: 'murr' }
type CatSays = keyof typeof example // "meow" | "murr"
Благодоря знанию о
keyof и Lookup Types они быстро сообразили, как затипизировать их функцию prop:
const prop<T, K extends keyof T>(obj: T, key: K) => obj[key]
Теперь они смогут спокойно жить и припевать в типобезопасном мире, типизируя любые функции, которые как-то получают только нужные поля объекта!
—
* с помощью
keyof можно получить все публичные не статические ключи пренадлежащие именно типу, потому в примере мы вынужденны получать запросом типа typeof.#w_corner_ts