Skip to content

Latest commit

 

History

History
118 lines (91 loc) · 2.58 KB

File metadata and controls

118 lines (91 loc) · 2.58 KB

8. 서로소 유니온 타입

서로소 유니온 타입

교집합이 없는 즉 서로소 관계에 있는 타입들을 모아 만든 유니온 타입


ex. 간단한 회원 관리 프로그램이 있다고 가정

type Admin = {
  name: string;
  kickCount: number;
};

type Member = {
  name: string;
  point: number;
};

type Guest = {
  name: string;
  visitCount: number;
};

type User = Admin | Member | Guest;

function login(user: User) {
  if ("kickCount" in user) {
		// Admin
    console.log(`${user.name}님 현재까지 ${user.kickCount}명 추방했습니다`);
  } else if ("point" in user) {
		// Member
    console.log(`${user.name}님 현재까지 ${user.point}모았습니다`);
  } else {
		// Guest
    console.log(`${user.name}님 현재까지 ${user.visitCount}번 오셨습니다`);
  }
}

회원의 역할 분류에 따라 3개의 타입을 각각 정의해 줌. 그리고 이 3개의 타입의 합집합 타입인 User 타입을 만듬

login 함수는 User 타입의 매개변수 user를 받아 회원의 역할에 따라 각각 다른 기능을 수행하도록 함

이렇게 작성하면 조건식만 보고 어떤 타입으로 좁혀지는지 바로 파악히기 힘듬…

→ 직관적이지 못한 코드임


이럴 때에는 다음과 같이 각 타입에 태그 프로퍼티를 추가 정의해주면 됨

type Admin = {
  tag: "ADMIN";
  name: string;
  kickCount: number;
};

type Member = {
  tag: "MEMBER";
  name: string;
  point: number;
};

type Guest = {
  tag: "GUEST";
  name: string;
  visitCount: number;
};

(...)

그럼 이제 login 함수의 타입가드를 다음과 같이 더 직관저그올 수정할 수 있게 됨

(...)

function login(user: User) {
  if (user.tag === "ADMIN") {
    console.log(`${user.name}님 현재까지 ${user.kickCount}명 추방했습니다`);
  } else if (user.tag === "MEMBER") {
    console.log(`${user.name}님 현재까지 ${user.point}모았습니다`);
  } else {
    console.log(`${user.name}님 현재까지 ${user.visitCount}번 오셨습니다`);
  }
}

또는 switch를 통해 더 직관적으로 변경할 수 있음

function login(user: User) {
  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;
    }
  }
}