TypeScript Academy · Урок

Утверждения const с помощью as const

Фиксируйте объекты и массивы как глубоко неизменяемые литеральные типы

Урок 3 из 413 шагов

«Утверждения const с помощью as const» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 4 уроков всего.

Утверждение неизменяемости

Утверждение константности, записываемое как as const, сообщает TypeScript, что для значения нужно вывести наиболее конкретный, глубоко неизменяемый тип readonly. Свойства объектов становятся literal и неизменяемыми; массивы — кортежами только для чтения.

const point = { x: 10, y: 20 } as const;
// type: { readonly x: 10; readonly y: 20 }
console.log(point.x, point.y);

Без утверждения неизменяемости

Без этого утверждения свойства объектов расширяются. { x: 10 } выводит для свойства x тип number, и его можно изменять. Сравните это с предыдущей сценой, чтобы увидеть, что меняет as const.

const a = { x: 10 };       // x: number, mutable
const b = { x: 10 } as const; // x: 10, readonly
a.x = 99; // allowed
console.log(a.x, b.x);

Закрепление свойств как literal-типов

as const превращает каждое строковое свойство в его literal-тип. Это особенно полезно для объектов config, ключи и значения которых должны оставаться точными.

const config = {
  env: 'production',
  retries: 3
} as const;
// env: 'production', retries: 3
console.log(config.env, config.retries);

Свойства только для чтения предотвращают изменение

Поскольку as const делает свойства доступными только для чтения, компилятор блокирует повторное присваивание. На уровне типов значение становится неизменяемым, что защищает его от случайных изменений.

const settings = { mode: 'dark' } as const;
console.log(settings.mode);
// settings.mode = 'light'; // Error: readonly property

Утверждения константности для массивов

При применении к массиву as const создаёт кортеж только для чтения из literal-типов. Длина фиксируется, и каждый элемент сохраняет своё точное значение.

const colors = ['red', 'green', 'blue'] as const;
// type: readonly ['red', 'green', 'blue']
console.log(colors[0], colors.length);

Изменение массивов только для чтения невозможно

Кортеж только для чтения не допускает методов изменения, таких как push, и присваивания по индексу. Данные блокируются, что именно и требуется для фиксированных таблиц поиска.

const days = ['Mon', 'Tue', 'Wed'] as const;
console.log(days.join(', '));
// days.push('Thu'); // Error: push does not exist on readonly tuple

Вывод объединения с помощью typeof arr[number]

Мощный приём: возьмите массив только для чтения и выведите объединение типов его элементов с помощью typeof arr[number]. Значения записываются один раз, а literal-объединение получается автоматически.

const ROLES = ['admin', 'editor', 'viewer'] as const;
type Role = typeof ROLES[number];
// 'admin' | 'editor' | 'viewer'
const r: Role = 'editor';
console.log(r);

Единый источник истины

Так массив во время выполнения и тип остаются синхронизированными. Добавьте значение в массив — и объединение обновится автоматически, без дублирующихся списков, которые нужно поддерживать.

const SIZES = ['S', 'M', 'L', 'XL'] as const;
type Size = typeof SIZES[number];

function pick(s: Size): void {
  console.log('Picked', s);
}
pick('M');

Утверждения константности для кортежей

Для кортежей с разными типами элементов as const сохраняет и точные типы, и порядок, создавая точный кортеж только для чтения.

const pair = [1, 'one'] as const;
// type: readonly [1, 'one']
console.log(pair[0], pair[1]);

Глубокая неизменяемость только для чтения

as const применяется ко всем уровням. Вложенные объекты и массивы также становятся доступными только для чтения и получают literal-типы вплоть до самого нижнего уровня.

const data = {
  name: 'app',
  tags: ['a', 'b']
} as const;
// tags is readonly ['a', 'b']
console.log(data.name, data.tags[1]);

Утверждения константности для перечислений

Константный объект в сочетании с выведенным объединением — облегчённая альтернатива enum. Вы получаете literal-значения во время выполнения и точный тип без дополнительного сгенерированного кода.

const Status = {
  Idle: 'idle',
  Active: 'active'
} as const;
type Status = typeof Status[keyof typeof Status];
const s: Status = Status.Active;
console.log(s);

Быстрая проверка

Проверьте, насколько хорошо Вы поняли утверждения константности.

Повторение: утверждение неизменяемости

Вы узнали, что as const:

  • выводит наиболее конкретный, глубоко неизменяемый literal-тип;
  • превращает свойства объектов в literal-поля, доступные только для чтения;
  • превращает массивы в кортежи только для чтения из literal-типов;
  • позволяет выводить объединения с помощью typeof arr[number], сохраняя синхронность значений и типов.

Далее мы объединим литералы в выразительные объединения.

const LEVELS = ['low', 'mid', 'high'] as const;
type Level = typeof LEVELS[number];
const chosen: Level = 'mid';
console.log(chosen);
Можно начать бесплатно

Изучай TypeScript с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
101
Уроки
352

Часто задаваемые вопросы

Урок «Утверждения const с помощью as const» бесплатный?

Да — полный текст урока «Утверждения const с помощью as const» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Утверждения const с помощью as const»?

Фиксируйте объекты и массивы как глубоко неизменяемые литеральные типы Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать TypeScript Academy?

Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Утверждения const с помощью as const»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке TypeScript Academy?

Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Литеральные типы строк и чисел
  2. Логические литералы и вывод литеральных типов
  3. Утверждения const с помощью as const
  4. Объединение литералов в объединения
← Назад к TypeScript Academy