Patrones
¿Cómo evito que una unión literal y el array u objeto usado en ejecución se desincronicen?
Mantén un valor como fuente de verdad, conserva sus literales con `as const` y consulta su tipo.
La receta
const roles = ['admin', 'editor', 'viewer'] as const type Role = (typeof roles)[number] const routes = { home: '/', settings: '/settings', } as const type RouteName = keyof typeof routes type RoutePath = (typeof routes)[RouteName]
La compilación compila esto y comprueba cada resultado de abajo.
Cómo funciona
- 01
const roles = ['admin', 'editor', 'viewer'] as const
La aserción const conserva cada elemento como literal y hace la tupla de solo lectura.
- 02
type Role = (typeof roles)[number]
`typeof` captura la tupla y `[number]` recoge todos sus elementos posibles.
Lo que obtienes
Role
→"admin" | "editor" | "viewer"RouteName
→"home" | "settings"RoutePath
→"/" | "/settings"
Dónde falla
`as const` no congela el objeto en ejecución. Solo estrecha la vista estática, así que los datos externos o mutables siguen necesitando validación y quizá congelación real.
Conclusión
Define los literales una vez como datos y deriva su unión; no mantengas a mano la misma lista en valor y tipo.
