📑 목차
타입스크립트의 대수 타입(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) 영역:
Dog타입만 만족하는 객체 (name, color) ✅ - (2) 영역:
Person타입만 만족하는 객체 (name, language) ✅ - (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 (공집합) 가 된다.
요약
- Union (
|): 두 원을 모두 색칠한 그림. 하나만 만족해도 통과. - Intersection (
&): 두 원의 가운데만 색칠한 그림. 모든 조건을 다 만족해야 통과 (프로퍼티 합체).
