FE develop/Typescript

📘 TypeScript - 리터럴, 유니온/교차 타입

hoj0806 2025. 5. 23. 16:39

 

 

 

 

타입스크립트를 사용할 때 자주 등장하는 개념 중 하나가 바로 리터럴 타입, 유니온 타입, 그리고 교차 타입입니다. 각각의 타입은 언제, 어떻게 사용해야 하는지 명확히 알고 있으면 코드의 안정성과 가독성을 크게 높일 수 있습니다. 이번 글에서는 이 세 가지 타입을 예제를 통해 쉽게 이해해 보겠습니다.

 

 

 

🔹 리터럴 타입 (Literal Type)

리터럴 타입은 특정한 값만 허용하는 타입입니다. 변수 선언 시 const를 쓰면 해당 값 자체가 타입으로 추론되기도 합니다.

const userName1 = 'Bob';  // 타입: 'Bob'
let userName2 = 'Tom';    // 타입: string (let은 재할당 가능하므로)

userName2 = 'John'; // ✅ 가능
// userName2 = 3;   // ❌ 에러: string 타입에 숫자는 할당 불가

 

🔸 실전 예제: 직업 타입 제한하기

type Job = 'police' | 'developer' | 'teacher';

interface User {
  name: string;
  job: Job;
}

const user: User = {
  name: 'Bob',
  job: 'police', // ✅ 허용된 값
  // job: 'student' // ❌ 에러: Job 타입에 없는 값
};

 

🔹 유니온 타입 (Union Type)

 

유니온 타입은 여러 타입 중 하나를 사용할 수 있음을 나타냅니다. | 기호를 사용합니다.

 

🔸 실전 예제: 서로 다른 타입의 객체 처리하기

interface Car {
  name: 'car';
  color: string;
  start(): void;
}

interface Mobile {
  name: 'mobile';
  color: string;
  call(): void;
}

function getGift(gift: Car | Mobile) {
  console.log(gift.color); // ✅ 공통 속성은 안전하게 접근 가능

  // gift.start(); // ❌ 에러: 공통 속성이 아님

  // 타입 좁히기 (Discriminated Union)
  if (gift.name === 'car') {
    gift.start(); // ✅ Car로 좁혀짐
  } else {
    gift.call();  // ✅ Mobile로 좁혀짐
  }
}

 

이렇게 name처럼 값으로 구분 가능한 고유 속성을 두면, 타입을 안전하게 구분할 수 있습니다. 이를 식별 가능한 유니온 타입이라고 합니다.

 

🔹 교차 타입 (Intersection Type)

교차 타입은 여러 타입을 모두 만족해야 하는 타입입니다. & 기호를 사용합니다.

 

🔸 실전 예제: 장난감 자동차

interface Car {
  name: string;
  start(): void;
}

interface Toy {
  name: string;
  color: string;
  price: number;
}

const toyCar: Toy & Car = {
  name: '타요',
  color: 'blue',
  price: 1000,
  start() {
    console.log("go...");
  }
};

 

Toy & Car는 Toy와 Car의 모든 속성을 포함한 객체여야 하며, 위 예제처럼 모든 속성을 구현해야 타입이 일치합니다.