Typescript Enum의 Key 반환받기, 모든 키/값 리스트 반환받기
Typescript의 enum 키워드
여타 다른 언어와 같이, 타입스크립트의 enum 키워드 역시 열거형을 나타내기 위해 사용됩니다. 그리고 마찬가지로, 다른 언어와 같이 멤버의 값은 정수형으로 변환되게 됩니다. 예를 들어 다음과 같은 코드가 있을 때,
enum TestEnum {
A,
B,
C,
D,
E,
}
각각의 값은 다음과 같이 나타납니다.
> TestEnum.A
0
> TestEnum.B
1
> TestEnum.C
2
> TestEnum.D
3
> TestEnum.E
4
즉, 열거형의 첫 번째 멤버부터 0으로 시작해 순차적으로 증가하는 방식입니다.
물론, 값을 지정할 수도 있습니다. 다음과 같이요.
enum TestEnum {
A = 3,
B,
C,
D,
E,
}
혹은, 플래그 형식으로 사용하기 위해 다음과 같이 지정할 수도 있습니다.
enum FlagEnum {
NOTHING = 0,
FRIENDLY = 1 << 0,
HOSTILE = 1 << 1,
NEUTRAL = 1 << 2,
SPECIAL = 1 << 3,
ALL = ~(~0 << 4),
}
열거형 필드는 number를 반환. 그렇다면 열거형의 이름을 반환하려면?
좋습니다. 열거형의 필드를 참조하면 열거형의 값, 즉 number 값이 반환되는 것은 알겠습니다. 하지만 열거형의 이름, 즉 A, B, C, D, E
각각을 반환받기 위해서는 어떻게 해야할까요?
공식 문서의 Reverse Mapping 항목을 보시면 아시겠지만, 만들어진 Enum의 key(A, B, C, D, E
)를 사용해 액세스하면 값(0, 1, 2, 3, 4; 혹은 지정한 number 값
)이 반환되고, 역으로 값을 통해 액세스하면 key가 반환됩니다. 즉,
enum TestEnum {
A,
B,
C,
D,
E,
}
> TestEnum.C
2
> TestEnum[TestEnum.C]
'C'
> TestEnum[2]
'C'
위와 같이 사용할 수 있다는 것이죠. 간단하죠?
그렇다면 열거형의 모든 키/값을 가져오는 방법은?
그렇습니다. 코딩을 하다보면, C#을 예로 들자면 리플렉션을 사용해야 하는 경우 등에 의해 열거형의 모든 필드를 가져올 필요가 있을 때도 있습니다. 그리고 그건 타입스크립트라고 다르지 않죠. 다음과 같이 열거형의 모든 값을 가져올 수 있습니다.
for (let member in TestEnum) {
console.log(member);
}
/* =>
0
1
2
3
4
A
B
C
D
E
*/
어라? 그런데 뭔가 이상합니다. 키와 값 모두가 나열되고 있습니다. 어떨 때엔 필요한 것이 키 뿐일 수도, 어떨 때엔 값 뿐일 수도 있습니다. 그럼 어떻게 해야 할까요? 이 모든 경우에 대해 모두 for 루프를 돌려서 if문으로 처리해야 할까요? 당연히 아닙니다.
filter()
바로 Array.filter()
를 쓰면 됩니다! 우선 키만 가져와봅시다.
let keys = Object.keys(TestEnum).filter(_ => typeof TestEnum[_ as any] === 'number');
> keys
[ 'A', 'B', 'C', 'D', 'E' ]
그럼 값 역시 쉽게 가져올 수 있겠죠?
let values = Object.keys(TestEnum)
.filter(_ => typeof TestEnum[_ as any] !== 'number')
.map(_ => parseInt(_));
> values
[ 0, 1, 2, 3, 4 ]
댓글
댓글 쓰기