В этом уроке мы разберем один из самых полезных Utility Types в TypeScript — Record<K, T>. Он позволяет создавать типизированные объекты, где ключи относятся к определенному набору строк или чисел, а значения имеют строго заданный тип. Это отличная альтернатива написанию сложных индексных сигнатур вручную.
Синтаксис прост: первый аргумент K — это объединение ключей (например, 'cat' | 'dog'), а второй T — тип значения. Это делает код чище и безопаснее при разработке приложений. Вы научитесь быстро описывать словари, мапы и конфигурационные объекты.
- Сокращение шаблонного кода.
- Гарантия наличия всех ключей из Union-типа.
- Интерактивные примеры использования.
Пройдите задания и тесты, чтобы закрепить понимание работы с объектными типами.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Структура Record
Разметьте структуру типа Record в TypeScript. В строке кода `type Roles = Record<"admin" | "user" | "guest", boolean>;` выделите три элемента: Utility Type Record, Union-ключи и Тип значений. Для каждого сегмента укажите его категорию из доступных вариантов.
type Roles = {{Record~|~t1}}<{{"admin" | "user" | "guest"~|~t2}}, {{boolean~|~t3}}>;2. Выбор аргументов
Вам дан интерфейс PageInfo, описывающий информацию о странице. Используя Utility Type Record, создайте тип для словаря страниц, где ключами будут строковые идентификаторы, а значениями — объекты типа PageInfo. В коде с пропусками выберите из выпадающего списка подходящие типы для параметров дженерика Record, чтобы получить корректную типизацию словаря.
interface PageInfo {
title: string;
url: string;
}
type Pages = Record<input1S, input2S>;3. Синтаксис Record
В этом задании вам нужно объявить тип для словаря (объекта) с помощью utility type Record. Заполните пропуски в коде так, чтобы тип MyDictionary корректно описывал объект, где ключи — строки, а значения — числа. Обратите внимание на синтаксис Record: он принимает два аргумента-типа в дженерике.
type MyDictionary =
input1S<
string input2S number
>;4. Эквивалентные типы
В левой колонке приведены определения типов с использованием утилиты Record, а в правой колонке — их эквивалентные развернутые интерфейсы или типы. Сопоставьте каждое определение слева с соответствующим эквивалентным типом справа. Обратите внимание, что в правой колонке типы перемешаны, и каждый тип используется только один раз.
Record<string, any>Record<'name' | 'age', string>Record<number, boolean>Record<'id', number>{ name: string; age: string }{ id: number }{ [key: number]: boolean }{ [key: string]: any }5. Лишнее свойство
В данном фрагменте TypeScript-кода объект типизирован с помощью утилитарного типа Record, но в его реализации присутствует лишнее свойство, которое не соответствует объявленному типу. Найдите строку с ошибкой и исправьте её, чтобы код стал корректным. Обратите внимание, что можно либо удалить лишнее свойство из объекта, либо изменить тип, чтобы включить это свойство.
// Пример Record с лишним свойствомconst obj: Record<'a' | 'b', number> = { a: 1, b: 2, c: 3 }; console.log(obj.a);console.log(obj.b);6. Сборка конфигурации
Из предложенных строк соберите корректный TypeScript-код, который определяет тип Config с помощью Record
type Config = Record<string, number>;const config: Config = { timeout: 3000, retries: 5};type Config = Record<string, string>;