Przejdź do treści
Wyprowadź unię z danych czasu działania

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    Wzorce

    Jak utrzymać literalną unię oraz tablicę lub obiekt używany w czasie działania bez rozjazdu?

    Zachowaj jedną wartość jako źródło prawdy, utrzymaj literały przez `as const`, a potem zapytaj o jej typ.

    Przepis

    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]

    Build to kompiluje i sprawdza każdy wynik poniżej.

    Jak to działa

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

      Asercja const zachowuje każdy element jako literał i czyni krotkę tylko do odczytu.

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

      `typeof` przechwytuje krotkę, a `[number]` zbiera każdy możliwy element.

    Co dostajesz

    Gdzie to zawodzi

    `as const` nie zamraża obiektu w czasie działania. Zawęża tylko widok statyczny, więc dane zewnętrzne lub mutowalne nadal wymagają walidacji i czasem prawdziwego zamrożenia.

    Wniosek

    Zdefiniuj literały raz jako dane i wyprowadź ich unię; nigdy nie utrzymuj ręcznie tej samej listy w przestrzeni wartości i typów.

    Zobacz też

    Wzorce