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
- 01
const roles = ['admin', 'editor', 'viewer'] as const
Asercja const zachowuje każdy element jako literał i czyni krotkę tylko do odczytu.
- 02
type Role = (typeof roles)[number]
`typeof` przechwytuje krotkę, a `[number]` zbiera każdy możliwy element.
Co dostajesz
Role
→"admin" | "editor" | "viewer"RouteName
→"home" | "settings"RoutePath
→"/" | "/settings"
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.
