타입스크립트 string Union type의 멤버 string인지 검사하기

hyeonQyu·2022년 7월 10일
0
post-thumbnail
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의 멤버인지 검사하면 됩니다.

profile
백엔드가 하고 싶었던 프론트엔드 개발자

0개의 댓글