본문 바로가기
Language/TypeScript

[TypeScript] 타입스크립트 이해(5) - 서로소 유니온 타입

by 쏘˚ 2025. 6. 15.
728x90

서로소 유니온 타입


/**
 * 1. 서로소 유니온 타입
 * : 교집합이 없는 타입으로만 만든 유니온 타입
 */
type Admin = {
    tag : "ADMIN"
    name : string;
    kickCount : number;
};

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

type Guest = {
    tag : "GUEST"
    name : string;
    visitCount : number;
};
/**
 * tag property를 추가해주면서 서로 교집합이 사라짐.
 * tag가 ADMIN이면서 MEMBER이면서 GEUST일 수 없기 때문
 */

type User = Admin | Member | Guest;

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;
            }
    }

    // if(user.tag === "ADMIN") {
    //     console.log(`${user.name}님 현재까지 ${user.kickCount}명 강퇴했습니다.`)
    // } else if (user.tag === "MEMBER") {
    //     console.log(`${user.name}님 현재까지 ${user.point}모았습니다.`)
    // } else if (user.tag === "GUEST") {
    //     console.log(`${user.name}님 현재까지 ${user.visitCount}번 오셨습니다.`)
    // }
};

/**
 * 복습을 위한 추가 사례
 * : 비동기 작업의 결과를 처리하는 객체
 */
type LoadingTask = {
    state : "LOADING";
};

type FailedTask = {
    state : "FAILED",
    error : {
        message : string;
    };
};

type SuccessTask = {
    state : "SUCCESS",
    response : {
        data : string;
    };
};

type AsyncTask = LoadingTask | FailedTask | SuccessTask;

function processResult(task : AsyncTask) {
    switch(task.state) {
        case "LOADING": {
            console.log("로딩 중...");
            break;
        }
        case "FAILED": {
            console.log(`에러 발생 : ${task.error.message}`);
            break;
        }
        case "SUCCESS": {
            console.log(`성공 : ${task.response.data}`);
            break;
        }
    }
}

const loading : AsyncTask = {
    state : "LOADING"
};

const failed : AsyncTask = {
    state : "FAILED",
    error : {
        message : "오류 발생 원인 : ",
    },
};

const success : AsyncTask = {
    state : "SUCCESS",
    response : {
        data : "반환 데이터 : ",
    },
};

 

※ 해당 글은 인프런 - 한 입 크기로 잘라먹는 타입스크립트(TypeScipt)를 참고하였습니다.

728x90
반응형