PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые типы

Что делает конструкция as const в TypeScript?

Продвинутые типы

`as const` (const assertion) говорит компилятору вывести для выражения самый узкий тип: литеральные значения вместо string и number, readonly для свойств и кортежи вместо массивов.

const config = { mode: 'dark', sizes: [1, 2, 3] } as const;
// {
//   readonly mode: 'dark';
//   readonly sizes: readonly [1, 2, 3];
// }

config.mode = 'light'; // ошибка: readonly

Что меняется

  • Литералы остаются литералами: 'dark', а не string.
  • Объекты получают readonly-свойства рекурсивно.
  • Массивы становятся readonly-кортежами с известной длиной и типами элементов.

Типичное применение

Источник правды для union-типа:

const ROLES = ['admin', 'user', 'guest'] as const;
type Role = (typeof ROLES)[number]; // 'admin' | 'user' | 'guest'

Значения можно использовать в рантайме (перебор, проверка), а тип выводится автоматически.

Ограничения

  • Работает только с литеральными выражениями (не с вызовами функций и переменными).
  • Не делает объект неизменяемым в рантайме — Object.freeze нужно вызывать отдельно.

Коротко для собеседования

as const фиксирует точные литеральные типы и делает данные readonly, а массивы — кортежами. Часто из массива констант выводят union: (typeof ARR)[number]. Это только проверка типов, в рантайме объект остаётся изменяемым.

Другие вопросы раздела