type Fruit = 'apple' | 'melon' | 'peach' | 'orange';
위와 같이 Fruit이라는 string의 Union type이 있을 때 특정 문자열이 이 Fruit 타입인지 검사하는 방법이 있을까요?
가장 쉬운 접근법으로 Fruit라는 type의 배열을 만들어 순회하며 확인하는 방법이 있을겁니다.
그러나 타입스크립트에서 이 Fruit의 멤버로 배열을 만드는 방법은 없었어요. (제가 찾아본 바로는 그렇습니다)
type Fruit = 'apple' | 'melon' | 'peach' | 'orange';
const fruitMembers: Fruit[] = ['apple', 'melon', 'peach', 'orange'];
function isFruitMember(str: string): boolean {
return fruitMembers.includes(str);
}
그럼 이런식으로 Fruit 타입을 담은 배열을 직접 만들어줘야 하는 것일까요?
물론 가능은 하지만 Fruit에 strawberry
가 새로 추가된다면 Fruit 타입 뿐만 아니라 fruitMembers도 함께 수정해주어야 합니다.
앞에서 했던 고민은 아래 코드로 해결할 수 있습니다.
const fruitMembers = ['apple', 'melon', 'peach', 'orange'] as const;
type Fruit = typeof fruitMembers[number];
function isFruitMember(str: string): boolean {
return fruitMembers.includes(str);
}
먼저 Fruit 멤버들을 담은 배열을 const assertion과 함께 선언해줍니다.
이후 Fruit 타입을 fruitMembers의 요소로 지정하고 isFruitMember를 통해 fruitMembers의 멤버인지 검사하면 됩니다.