-
(TypeScript) - 서로소 유니온 타입개발/TypeScript 2025. 8. 21. 13:46반응형
■ 서로소 유니온 타입
: 교집합이 없는 타입들로만 만든 유니온 타입을 말한다.
즉, 두 타입 간에 공통적으로 포함되는 값이 하나도 없는 타입이다.
string 과 number 은 공통적인 값 즉, 교집합이 존재하지 않는다.
이런 집합을 수학에서는 서로소 집합이라고 표현한다.
이런 string 과 number 과 같은 집합의 타입을 서로소 유니온 타입이라 한다.
type Admin = { tag: 'ADMIN'; name: string; kickCount: number; }; type Member = { tag: 'MEMBER'; name: string; point: number; }; type Guset = { tag: 'GUEST'; name: string; visitCount: number; };다음과 같이 tag 를 통해서 서로소 유니온 타입을 만들 수 있다.
tag 를 스트링 리터럴 타입으로 만들어준다.
if (user.tag === 'ADMIN') { // admin 타입 console.log(`${user.name}님 현재까지 ${user.kickCount} 명 강퇴했습니다.`); } else if (user.tag === 'MEMBER') { // member 타입 console.log(`${user.name}님 현재까지 ${user.point} 모았습니다.`); } else { // guset 타입 console.log(`${user.name}님 현재까지 ${user.visitCount} 번 오셨습니다.`); }태그를 불러오면 user.tag === 'ADMIN' 과 같이 문자 그대로를 보여주기 때문에
어떤 타입인지 한 눈에 알 수 있다.
switch (user.tag) { case 'ADMIN': { console.log(`${user.name}님 현재까지 ${user.kickCount} 명 강퇴했습니다.`); break; } case 'MEMBER': { console.log(`${user.name}님 현재까지 ${user.point} 모았습니다.`); break; } case 'GUEST': { console.log(`${user.name}님 현재까지 ${user.visitCount} 번 오셨습니다.`); break; }switch 케이스가 있으면 위 코드보다 더욱 깔끔하고 가독성 있게 볼 수 있다.
이렇게 tag 를 붙이면 서로서 타입이 되는 이유는 그럼 뭘까?
tag 를 붙이기 전에는 각각의 타입이 서로 교집합이 존재할 수 있었다.
예시로 ADMIN과 MEMBER 만 보면 둘의 교집합은 name, kickCount, point 가진 객체이다.
그런데 여기서 tag 를 각각 tag: ADMIN , tag: MEMBER 를 추가하면 서로소 타입이 된다.
왜냐하면 tag 는 스트링 리터럴 타입을 가지는데 스트링 리터럴 타입은 딱 한개의 값만 포함하기 때문이다.
type User = Admin | Member | Guset;따라서 서로소 관계에 있는 객체 타입들을 유니온 타입으로 묶었기 때문에 User 는 서로소 유니온 타입이 된다.
이렇게 동시에 여러가지 상태를 표현해야 되는 객체 타입을 정의할 때는
선택적 프로퍼티 보다는 상태에 따라서 타입들을 잘게 쪼개서 tag 같은 프로퍼티를 추가해서
서로소 유니온 타입으로 만들어 주는게 좋다.
그래야 스위치 케이스문 같은 걸 이용했을 때 더 직관적이고 안전하게 타입을 좁혀서 코드를 만들 수 있기 때문이다.
tag 를 붙여 객체를 구별해 내는 이 것을 태그드 유니온 타입이라고도 한다.
반응형'개발 > TypeScript' 카테고리의 다른 글
(TypeScript) - 함수 타입 표현식과 호출 시그니처 (0) 2025.08.22 (TypeScript) - 함수 타입 (0) 2025.08.22 (TypeScript) - TypeScript 타입 좁히기 (1) 2025.08.20 (TypeScript) - TypeScript 타입 단언 (0) 2025.08.20 (TypeScript) - TypeScript 타입 추론 (0) 2025.08.20