Проверяет понимание механизма вывода типов для объектных литералов в TypeScript и влияния модификатора as const на ширину выводимых типов.
Когда вы создаёте объектный литерал в TypeScript, компилятор автоматически выводит типы его свойств. По умолчанию работает механизм расширения типов (type widening): строковые литералы превращаются в string, числовые — в number, булевы — в boolean. Это удобно для изменяемых объектов, но иногда мешает сохранить точные значения.
Рассмотрим пример:
const user = {
name: "Alice",
age: 30,
role: "admin"
};
// typeof user = { name: string; age: number; role: string }
TypeScript «расширил» литералы "Alice", 30 и "admin" до общих типов. Если попытаться присвоить user.role = "user", ошибки не будет, потому что тип string допускает любое значение.
Модификатор as const (const assertion) запрещает расширение и делает все свойства readonly:
const user = {
name: "Alice",
age: 30,
role: "admin"
} as const;
// typeof user = {
// readonly name: "Alice";
// readonly age: 30;
// readonly role: "admin";
// }
Теперь user.role имеет тип "admin", а не string. Любая попытка изменить свойство вызовет ошибку компиляции.
const ROUTES = {
home: "/",
about: "/about",
user: "/user"
} as const;
type RouteKey = keyof typeof ROUTES; // "home" | "about" | "user"
type RoutePath = typeof ROUTES[RouteKey]; // "/" | "/about" | "/user"
function navigate(path: RoutePath) { /* ... */ }
navigate(ROUTES.home); // OK
// navigate("/unknown"); // Ошибка компиляции
Без as const тип RoutePath был бы просто string, и компилятор не смог бы поймать опечатку.
Итог: используйте as const, когда нужно сохранить точные литеральные типы и запретить мутацию — это даёт более строгую проверку на этапе компиляции и улучшает автодополнение в IDE.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию