Saltar al contenido
Derivar una unión desde datos de ejecución

    ↑↓ mover · ⏎ abrir · esc cerrar

    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

    1. 01
      const roles = ['admin', 'editor', 'viewer'] as const

      La aserción const conserva cada elemento como literal y hace la tupla de solo lectura.

    2. 02
      type Role = (typeof roles)[number]

      `typeof` captura la tupla y `[number]` recoge todos sus elementos posibles.

    Lo que obtienes

    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.

    Véase también

    Patrones