Иногда нам нужно зафиксировать объект или массив так, чтобы он стал полностью неизменяемым (readonly), а все его строковые свойства превратились в литеральные типы. Для этого в TypeScript используется утверждение as const.
Если написать const config = { method: 'POST' } as const;, то поле method будет иметь тип не просто string, а 'POST', и сам объект нельзя будет изменить. Это превращает данные в глубокие константы, что крайне полезно при определении конфигураций или действий в Redux.
В этом уроке мы разберем, как работает эта конструкция. Вы увидите разницу между обычным const (который защищает только ссылку на переменную) и as const (который замораживает структуру и типы значений). Примеры кода наглядно покажут преимущества этого подхода.
- Модуль 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. Тип свойства
Проанализируйте представленный фрагмент кода TypeScript, в котором объект объявлен с использованием утверждения `as const`. Определите, какой конкретный тип будет присвоен числовому свойству этого объекта. Выберите правильный вариант из предложенных ниже.
const serverConfig = {
port: 8080,
hostname: 'localhost',
sslEnabled: true
} as const;
// Какой тип будет у свойства port?2. Const vs as const
В левой колонке приведены объявления переменных на 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;3. Использование в массиве
В данном задании представлен фрагмент кода 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);4. Создание readonly кортежа
Из предложенных строк соберите корректный код на TypeScript, который создаёт переменную colors как readonly кортеж (readonly tuple) с помощью утверждения as const. Кортеж должен содержать три строковых значения: 'red', 'green', 'blue'. Игнорируйте лишние строки, которые не соответствуют заданию или нарушают синтаксис.
const colors = ['red', 'green', 'blue'] as const;let colors = [as const];'yellow'5. Readonly поля
Перед вами фрагмент кода на 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}};