TypeScript

[TypeScript] 대수 타입 (Union과 Intersection)

2025년 11월 27일
1
TypeScriptStudyTypeSystemUnionIntersection

📑 목차

타입스크립트의 대수 타입(Algebraic Type) 은 여러 개의 타입을 합성해서 만드는 타입이다. 이 개념은 코드로만 보면 헷갈릴 수 있지만, 수학의 집합(Set) 개념인 벤 다이어그램(Venn Diagram)으로 보면 아주 명쾌하게 이해된다.

1. 합집합 - Union 타입 (|)

Union 타입은 "A이거나 B이다 (OR)" 를 의미한다. 집합으로 표현하면 두 원형의 모든 영역(합집합) 이 유효한 타입의 범위가 된다.

1-1. 시각적 개념도

String | Number 타입을 그림으로 상상해 보자.

      [ String | Number ]

   ╭────────╮       ╭────────╮
   │        │       │        │
   │ String │   U   │ Number │
   │  (OK)  │       │  (OK)  │
   │        │       │        │
   ╰────────╯       ╰────────╯
   
   👉 둘 중 하나만 만족하면 통과!

색칠된 모든 범위가 집합에 포함되므로, string도 되고 number도 된다.

1-2. 객체 타입에서의 Union (함정 주의!)

객체 타입에서 Union을 쓸 때 많은 사람이 헷갈려 한다. 다음 예시를 보자.

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

type Union1 = Dog | Person;

이 타입을 벤 다이어그램으로 그리면 다음과 같다.

       [ Union1 타입의 허용 범위 ]

      ( Dog )           ( Person )
   ╭─────────────╮   ╭─────────────╮
   │ name        │   │ name        │
   │ color       │   │ language    │
   │             │   │             │
   │   (1)       │(3)│     (2)     │
   │ 🐶 Dog만     │ 교 │ 👤 Person만 │
   │ 만족해도 OK   │ 집 │ 만족해도 OK   │
   │             │ 합 │            │
   ╰─────────────╯   ╰─────────────╯

이 그림에 따르면 다음 3가지 경우가 모두 허용된다 .

  1. (1) 영역: Dog 타입만 만족하는 객체 (name, color) ✅
  2. (2) 영역: Person 타입만 만족하는 객체 (name, language) ✅
  3. (3) 영역: 둘 다 만족하는 객체 (name, color, language) ✅

하지만, 어느 원 안에도 들어가지 못하는 경우는 에러가 난다.

// ❌ (4) 영역 밖: Dog도 아니고 Person도 아님
let fail: Union1 = {
  name: "누구세요" // color나 language가 없어서 어느 집합에도 못 들어감
};

이처럼 Union 타입은 "적어도 하나의 타입 조건은 완벽히 갖춰야 한다" 는 것을 그림으로 기억하면 쉽다 .


2. 교집합 - Intersection 타입 (&)

Intersection 타입은 "A이면서 동시에 B이다 (AND)" 를 의미한다. 집합으로 표현하면 두 원형이 겹치는 부분(교집합) 만이 유효한 타입의 범위가 된다.

2-1. 시각적 개념도

Dog & Person 타입을 그림으로 보면 가운데 겹친 부분만 색칠된다.

      [ Dog & Person (Intersection) ]

      ( Dog )           ( Person )
   ╭─────────────╮   ╭─────────────╮
   │             │ 빗 │             │
   │   (Invalid) │ 금 │  (Invalid)  │
   │             │ 칠 │             │
   │ Dog만 있어도  │ 한 │ Person만     │
   │    탈락!     │ 곳 │ 있어도 탈락!   │
   │             │ 만 │             │
   ╰─────────────╯ OK ╰─────────────╯

2-2. 객체 타입 합성 (프로퍼티 합치기)

Intersection 타입은 두 집합의 모든 속성을 다 가지고 있어야 교집합 영역(가운데)에 들어갈 수 있다. 즉, 프로퍼티가 합쳐지는 효과가 난다.

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

type Inter = Dog & Person;

이 타입이 되려면 Dog의 조건과 Person의 조건을 동시에 만족해야 한다.

let hybrid: Inter = {
  name: "개사람",
  color: "brown",    // Dog의 조건
  language: "woof",  // Person의 조건
};

결국 Intersection 타입은 객체에서 "모든 프로퍼티를 다 때려 넣은 슈퍼 객체" 를 만들 때 사용된다고 이해하면 된다.

2-3. 기본 타입의 교집합 (never)

만약 서로 겹칠 수 없는 타입끼리 교집합을 만들면 어떻게 될까?

let nothing: number & string;
   [ number ]       [ string ]
   ╭────────╮       ╭────────╮
   │   1    │       │  "a"   │
   │   2    │   X   │  "b"   │
   ╰────────╯       ╰────────╯
      서로 겹치는 부분이 없음 (공집합)

숫자이면서 동시에 문자인 값은 존재하지 않는다. 교집합이 없으므로 이 타입은 never (공집합) 가 된다.


요약

  1. Union (|): 두 원을 모두 색칠한 그림. 하나만 만족해도 통과.
  2. Intersection (&): 두 원의 가운데만 색칠한 그림. 모든 조건을 다 만족해야 통과 (프로퍼티 합체).
@taemni

@taemni

안녕하세요, 차근차근 성장 중인 조태민입니다.

instagram

댓글