Объекты с динамической структурой часто используются для построения контекста или хранения данных. Например, так происходит, когда мы добавляем в них поля во время исполнения программы. Давайте напишем вспомогательный тип для построения такого объекта:
type Context<K extends string, V> = {
[Key in K]: V;
}
const runApp = <C extends Context<string, unknown>>(ctx: C) => {}
Ключ Key
примет перебором все значения из K
. В свою очередь, K
является подмножеством string
, а V
может быть любым. Так мы создали свой тип Context
со строковыми полями и неизвестным типом для значения.
Подобная конструкция, когда мы не задаем дополнительно никаких специфичных полей с динамическими ключами, встречается довольно часто. Встроенные Utility Types предоставляют для этого готовое решение — Record<Keys, Type>
. Этот обобщенный тип принимает первым аргументом тип ключа, а вторым — тип значения. Внутри все устроенно схожим образом, как в нашем типе Context
:
type Rating = 0 | 1 | 2 | 3 | 4 | 5
type SongsRating = Record<string, Rating>
const songsRating: SongsRating = {
ratata: 4,
}
Таким типом SongsRating
мы можем задать тип объекта с произвольным ключом (именем песни) и рейтингом — числом от нуля до пяти.
Использование Record
является предпочтительным при описании объектных типов в TypeScript. Это позволяет гибко и лаконично описывать динамические структуры и использовать Record
совместно с другими типами данных.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.