Что делает конструкция 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]. Это только проверка типов, в рантайме объект остаётся изменяемым.