Комбинация keyof typeof

Тренажер по TypeScript для пользователей с начальным уровнем подготовки.

Тренажер по TypeScript

Комбинация операторов keyof typeof — это мощный паттерн в TypeScript, позволяющий извлечь ключи из конкретного значения (объекта), а не из типа.

Обычно keyof применяется к типам. Но что, если у нас есть объект конфигурации или словарь констант, и мы хотим создать тип, разрешающий только ключи этого объекта? Сначала мы используем typeof, чтобы получить тип объекта, а затем сразу применяем keyof, чтобы получить объединение (Union) строковых литералов его ключей.

Пример: type Keys = keyof typeof myObject;. Это позволяет поддерживать принцип единственного источника правды: вы меняете объект, а тип обновляется автоматически.

Список тем

1. Создание типа из объекта

id: 40744_keyof_typeof_01_replace

Дан объект colors, который содержит три цвета в формате HEX. Необходимо создать тип ColorName, который будет представлять собой объединение строковых литералов - ключей объекта colors. Для этого используйте комбинацию операторов keyof и typeof. В первом пропуске введите ключевые слова keyof и typeof, во втором — имя объекта colors. После правильного заполнения тип ColorName будет равен 'red' | 'green' | 'blue'.

Заполните пропуски
const colors = {
  red: '#FF0000',
  green: '#00FF00',
  blue: '#0000FF'
};

// Создайте тип ColorName из ключей объекта colors, используя keyof и typeof
type ColorName = input1S input2S;

const myColor: ColorName = 'red';
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Цепочка преобразований

id: 40744_keyof_typeof_02_analyze

Проанализируйте TypeScript-код сверху и восстановите последовательность логических шагов выполнения программы. Шаги снизу перемешаны — расставьте их в правильном порядке, чтобы отразить, как программа использует операторы keyof и typeof для работы с типами на основе объекта.

const person = {
  name: 'Alice',
  age: 30,
  city: 'Paris'
};

type Person = typeof person;
type PersonKeys = keyof Person;

function getValue(obj: Person, key: PersonKeys) {
  return obj[key];
}

const key: PersonKeys = 'name';
console.log(getValue(person, key));
Расположите элементы в логичном порядке
Объявление функции getValue, которая принимает объект типа Person и ключ типа PersonKeys и возвращает значение
Объявление объекта person с тремя свойствами: name, age, city
Создание типа PersonKeys, который представляет объединение ключей типа Person с помощью оператора keyof
Определение переменной key типа PersonKeys и присвоение ей значения 'name'
Создание типа Person на основе типа объекта person с помощью оператора typeof
Вызов функции getValue с объектом person и ключом key
Вывод результата (значения свойства name объекта person) в консоль
Сообщения
Проверить
Показать подсказку

3. Порядок операторов

id: 40744_keyof_typeof_03_error

В этом фрагменте TypeScript-кода определён объект colors, который содержит три цвета в формате HEX. Затем предпринимается попытка создать тип ColorKeys, который должен представлять объединение строковых литералов ключей объекта colors. Однако в строке определения типа допущена ошибка в порядке использования операторов typeof и keyof. Исправьте эту строку, чтобы тип ColorKeys корректно определялся как объединение ключей объекта colors.

Найдите ошибку и исправьте
// Объект colors содержит три цвета в формате HEX
const colors = { red: '#FF0000', green: '#00FF00', blue: '#0000FF' };
type ColorKeys = typeof keyof colors;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Типизация аргументов

id: 40744_keyof_typeof_04_select

В данном задании вам предстоит заполнить пропуски в коде TypeScript, чтобы функция getConfig принимала только существующие ключи объекта config. Используйте выпадающие списки, чтобы выбрать правильный тип для параметра key и конкретный ключ для вызова функции. Это упражнение поможет закрепить понимание комбинации операторов keyof и typeof для безопасного доступа к свойствам объектов.

Нужно правильно расставить в пропуски предложенные варианты
const config = {
  port: 3000,
  host: 'localhost',
  debug: true
};

function getConfig(key: input1S) {
  return config[key];
}

// Пример использования
const port = getConfig(input2S);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Результат объединения

id: 40744_keyof_typeof_05_predict

Рассмотрите приведённый фрагмент кода на TypeScript, использующий комбинацию операторов keyof и typeof. Определите, какой тип будет присвоен псевдониму типа ColorKeys в результате выполнения этой операции. Выберите один правильный вариант из предложенных ниже.

Выберите правильный вариант ответа
const colors = { red: '#FF0000', blue: '#0000FF' };
type ColorKeys = keyof typeof colors;
Сообщения
Проверить
Показать подсказку

6. Lookup типы

id: 40744_keyof_typeof_06_build

Из предложенных строк соберите корректную TypeScript-программу, которая создаёт объект product, определяет тип для его ключей с помощью комбинации keyof typeof, объявляет переменную этого типа, присваивает ей допустимое значение и выводит это значение в консоль. Некоторые строки лишние и не должны входить в решение.

Перетяните в правильном порядке строки из одного блока в другой
const product = { name: "Laptop", price: 1500, category: "Electronics" };
type ProductKeys = keyof typeof product;
let key: ProductKeys;
key = "name";
console.log(key);
key = "invalid";
let key2: string;
type ProductKeys2 = keyof product;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

TypeScript: компиляция и запуск

id: 40744_compiler
TS
Запустить тренажёр (TypeScript)
НайтиКурс.Ру