as const утверждение

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

Тренажер по TypeScript

Иногда нам нужно зафиксировать объект или массив так, чтобы он стал полностью неизменяемым (readonly), а все его строковые свойства превратились в литеральные типы. Для этого в TypeScript используется утверждение as const.

Если написать const config = { method: 'POST' } as const;, то поле method будет иметь тип не просто string, а 'POST', и сам объект нельзя будет изменить. Это превращает данные в глубокие константы, что крайне полезно при определении конфигураций или действий в Redux.

В этом уроке мы разберем, как работает эта конструкция. Вы увидите разницу между обычным const (который защищает только ссылку на переменную) и as const (который замораживает структуру и типы значений). Примеры кода наглядно покажут преимущества этого подхода.

Список тем

1. Тип свойства

id: 40669_ts_const_predict_02

Проанализируйте представленный фрагмент кода TypeScript, в котором объект объявлен с использованием утверждения `as const`. Определите, какой конкретный тип будет присвоен числовому свойству этого объекта. Выберите правильный вариант из предложенных ниже.

Выберите правильный вариант ответа
const serverConfig = {
  port: 8080,
  hostname: 'localhost',
  sslEnabled: true
} as const;

// Какой тип будет у свойства port?
Сообщения
Проверить
Показать подсказку

2. Const vs as const

id: 40669_ts_const_compare_04

В левой колонке приведены объявления переменных на TypeScript, а в правой — описания их типов и изменяемости. Сопоставьте каждое объявление с соответствующим описанием. Обратите внимание на использование утверждения `as const` и его влияние на вывод типов и возможность изменений.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
const obj = { a: 1, b: 2 };
const obj = { a: 1, b: 2 } as const;
const arr = [1, 2, 3];
const arr = [1, 2, 3] as const;
const nested = { a: { b: 1 } };
const nested = { a: { b: 1 } } as const;
Массив чисел (тип: number[]), элементы можно изменять
Объект с readonly свойствами и литеральными типами (тип: { readonly a: 1, readonly b: 2 })
Объект с изменяемыми свойствами (тип: { a: number, b: number })
Вложенный объект, все уровни readonly (тип: { readonly a: { readonly b: 1 } })
Кортеж readonly с литеральными типами (тип: readonly [1, 2, 3])
Вложенный объект, внутренний объект изменяем (тип: { a: { b: number } })
Сообщения
Проверить
Показать подсказку

3. Использование в массиве

id: 40669_ts_const_select_fill_05

В данном задании представлен фрагмент кода TypeScript, в котором массив объектов объявлен с использованием утверждения `as const`. Это приводит к тому, что типы элементов массива и их полей становятся литеральными и доступными только для чтения. Вам необходимо заполнить пропуски, выбрав правильные типы для переменных, которые выводятся из этого массива. Обратите внимание, что `as const` сужает типы до конкретных значений, а не общих примитивов.

Нужно правильно расставить в пропуски предложенные варианты
const books = [
  { title: "1984", author: "George Orwell", year: 1949 },
  { title: "Brave New World", author: "Aldous Huxley", year: 1932 }
] as const;

const firstBook: input1S = books[0];
const firstBookTitle: input2S = books[0].title;

console.log(firstBook);
console.log(firstBookTitle);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Создание readonly кортежа

id: 40669_ts_const_build_06

Из предложенных строк соберите корректный код на TypeScript, который создаёт переменную colors как readonly кортеж (readonly tuple) с помощью утверждения as const. Кортеж должен содержать три строковых значения: 'red', 'green', 'blue'. Игнорируйте лишние строки, которые не соответствуют заданию или нарушают синтаксис.

Перетяните в правильном порядке строки из одного блока в другой
const colors = [
'red', 
'green', 
'blue'
] as const;
let colors = [
as const
];
'yellow'
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Readonly поля

id: 40669_ts_const_click_07

Перед вами фрагмент кода на TypeScript, в котором объект объявлен с использованием утверждения `as const`. Внимательно изучите код. Ваша задача — отметить (кликнуть) все ключи (имена) свойств этого объекта, которые становятся доступными только для чтения (readonly) после применения `as const`. Не отмечайте значения свойств, имя переменной, ключевое слово `as const`, фигурные скобки, запятые или другие элементы синтаксиса.

Кликните по всем фрагментам, которые подходят под условие задания.
const {{config~|~t0}} = {
  {{apiUrl~|~t1}}: {{'https://api.example.com'~|~t4}},
  {{maxRetries~|~t2}}: {{3~|~t5}},
  {{timeout~|~t3}}: {{5000~|~t6}},
  {{debug~|~t7}}: {{false~|~t8}}
} {{as const~|~t9}};
Сообщения
Проверить
Показать подсказку

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

id: 40669_compiler

В этом упражнении вы научитесь превращать обычные объекты в строгие литеральные типы с помощью `as const`. Попробуйте удалить `as const` у объекта CONFIG и посмотрите, как изменятся подсказки типов: вместо конкретного значения 'dark' свойство станет просто строкой 'string'. Экспериментируйте: добавьте новые поля в объект или элементы в массив DIRECTIONS и попытайтесь их изменить в коде — TypeScript сразу укажет на ошибку доступа только для чтения!

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