반응형
오브젝트 키를 기반으로 TypeScript에서 동적으로 열거형을 생성하는 방법이 있습니까?
개체를 정의하고 있으며 키를 기반으로 동적으로 열거형을 생성하여 IDE 제안을 받고 잘못된 키를 호출하지 않습니다.
const appRoutes = {
Login,
Auth,
NotFound
}
enum AppRoutes = {[Key in keyof appRoutes]: [keyof appRoutes]}
개체 키에서 실제 열거형을 작성할 수 없습니다.
다음과 같이 모든 키의 조합을 얻을 수 있습니다.keyof typeof appRoutes
그러면 원하는 유형의 안전 효과를 얻을 수 있습니다.
type AppRoutes = keyof typeof appRoutes
let ok: AppRoutes = "Auth";
let err: AppRoutes = "Authh";
그러나 열거형은 단순한 유형이 아니라 열거형의 키와 값을 포함하는 런타임 개체이기도 합니다.유형 스크립트는 문자열 결합에서 이러한 개체를 자동으로 만드는 방법을 제공하지 않습니다.그러나 개체의 키와 유니온의 구성원이 동기화된 상태를 유지하도록 하는 유형을 만들 수 있으며 동기화되지 않으면 컴파일러 오류가 발생합니다.
type AppRoutes = keyof typeof appRoutes
const AppRoutes: { [P in AppRoutes]: P } = {
Auth : "Auth",
Login: "Login",
NotFound: "NotFound" // error if we forgot one
// NotFound2: "NotFound2" // err
}
let ok: AppRoutes = AppRoutes.Auth;
다음 해결 방법을 사용하여 키를 고정 키 -> 키 개체로 변환합니다.
const { Login, Auth, NotFound } = {} as any
const appRoutes = {
Login,
Auth,
NotFound
}
const AppRoutes = (() => ({
...Object.keys(appRoutes)
.filter(k => isNaN(Number(k)))
.reduce((acc, cur) => ({
...acc,
[cur]: cur,
}), {}),
} as {
[k in keyof typeof appRoutes]: k
}))()
console.info(AppRoutes)
// AppRoutes: {
// Login: "Login";
// Auth: "Auth";
// NotFound: "NotFound";
// }
언급URL : https://stackoverflow.com/questions/54058699/is-there-a-way-to-dynamically-generate-enums-on-typescript-based-on-object-keys
반응형
'programing' 카테고리의 다른 글
VueX: 모듈로 상태를 중첩하지 않습니까? (0) | 2023.06.15 |
---|---|
R이 단축 축 레이블(과학적 표기법) 표시를 중지하도록 합니다(예: 1e+00). (0) | 2023.06.15 |
IEnumberable에 Count 메서드가 없습니다. (0) | 2023.06.15 |
한 사전이 다른 더 큰 사전의 하위 집합인지 확인하는 방법은 무엇입니까? (0) | 2023.06.15 |
.contiguous()는 PyTorch에서 무엇을 합니까? (0) | 2023.06.15 |