[TypeScript] 대수 타입(Algebraic Types)

ttining·2025년 3월 25일

대수 타입

대수 타입이란 여러 개의 타입을 조합하여 새로운 타입을 만드는 방식을 말한다.
대표적으로 Union 타입(합집합)과 Intersection(교집합) 타입이 있다.


1️⃣ Union 타입 (합집합)

Union 타입은 여러 타입 중 하나만 해당하면 되는 타입을 의미한다.
즉, A | BA이거나 B일 수 있지만, 둘 다일 수도 있다. (둘 다 포함할 필요는 없다.)

📌 특징

  • A | BA 또는 B 중 하나의 형태를 가지면 된다.
  • A의 속성만 가져도 되고, B의 속성만 가져도 된다.
  • 두 타입의 속성을 모두 가지는 것도 가능하다.
  • 하지만 공통 속성이 없으면 타입 오류가 발생한다.

📌 예시

let a: string | number | boolean;

a = 1;          // number ✅
a = "hello";    // string ✅
a = true;       // boolean ✅

let arr: (number | string | boolean)[] = [1, "hello", true]; // ✅ 가능

📌 객체 타입을 이용한 Union 타입

객체 타입에서 A | BA 또는 B 형태일 수 있지만, 반드시 모든 속성을 가질 필요는 없다.

type Dog = {
  name: string;
  color: string;
};

type Person = {
  name: string;
  language: string;
};

type Union1 = Dog | Person;

// Dog 타입 (가능)
let union1: Union1 = {
  name: "꽝꽝이",
  color: "white",
};

// Person 타입 (가능)
let union2: Union1 = {
  name: "띠닝",
  language: "Korean",
};

// Dog & Person 타입 (가능)
let union3: Union1 = {
  name: "두식이",
  color: "black",
  language: "English",
};

// 오류 발생 (name은 공통 속성이지만 color 또는 language가 없다.)
let union4: Union1 = {
  name: "", // ❌ 오류
};

⚠️ 유의할 점

  • Union1 타입은 Dog 또는 Person 중 하나의 타입을 가져야 한다.
  • union3처럼 모든 속성을 포함하는 것도 가능하다. (필수 ❌)
  • union4name만 있고 colorlanguage가 없으므로 오류가 발생한다.


2️⃣ Intersection 타입 (교집합)

Intersection 타입은 모든 타입(두 개 이상)의 속성을 합친 새로운 타입을 만든다.
즉, A & BAB의 모든 속성을 가져야 하는 타입이다.

📌 특징

  • A & BAB의 모든 속성을 포함해야 한다.
  • 하나의 타입에만 속성이 포함되면 오류가 발생한다.
  • 두 개 이상의 타입을 조합할 때 강력한 제약을 줄 수 있다.

📌 예시

let variable: number & string; // ❌ never 타입

⚠️ number & stringnever인 이유

  • numberstring을 동시에 만족하는 값은 존재할 수 없다.
  • 따라서 number & string은 never 타입이 된다.

📌 객체 타입을 이용한 Intersection 타입

type Dog = {
  name: string;
  color: string;
};

type Person = {
  name: string;
  language: string;
};

type Intersection = Dog & Person;

// Dog와 Person의 모든 속성을 포함해야 한다.
let intersection1: Intersection = {
  name: "꽝꽝이",
  color: "white",
  language: "Korean",
};

// 오류 발생 (color 또는 language가 없으므로 불완전한 객체)
let intersection2: Intersection = {
  name: "두식이",
  color: "black",
}; // ❌ 오류

⚠️ 유의할 점

  • Intersection 타입은 DogPerson의 속성을 모두 포함해야 한다.
  • 하나라도 빠지면 타입 오류가 발생한다.
  • Union과 다르게 선택적이 아니라 필수적으로 모든 속성이 있어야 한다.
profile
내가 보려고 만든 벨로그 *'-'*

0개의 댓글