Intersection

1개의 게시글

TypeScript

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

November 27, 2025

타입스크립트의 대수 타입(Algebraic Type) 은 여러 개의 타입을 합성해서 만드는 타입이다. 이 개념은 코드로만 보면 헷갈릴 수 있지만, 수학의 집합(Set) 개념인 벤 다이어그램(Venn Diagram)으로 보면 아주 명쾌하게 이해된다. 1. 합집합 - Union 타입 (|) Union 타입은 "A이거나 B이다 (OR)" 를 의미한다. 집합으로 표현하면 두 원형의 모든 영역(합집합) 이 유효한 타입의 범위가 된다. 1-1. 시각적 개념도 String | Number 타입을 그림으로 상상해 보자. Plaintext [ String | Number ] ╭────────╮ ╭────────╮ │ │ │ │ │ String │ U │ Number │ │ (OK) │ │ (OK) │ │ │ │ │ ╰────────╯ ╰────────╯ 👉 둘 중 하나만 만족하면 통과! 색칠된 모든 범위가 집합에 포함되므로, string도 되고 number도 된다. 1-2. 객체 타입에서의 Union (함정 주의!) 객체 타입에서 Union을 쓸 때 많은 사람이 헷갈려 한다. 다음 예시를 보자. TypeScript type Dog = { name: string; color: string; }; type Person = { name: string; language: string; }; type Union1 = Dog | Person; 이 타입을 벤 다이어그램으로 그리면 다음과 같다. Plaintext [ 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) ✅ 하지만, 어느 원 안에도 들어가지 못하는 경우는 에러가 난다. TypeScript // ❌ (4) 영역 밖: Dog도 아니고 Person도 아님 let fail: Union1 = { name: "누구세요" // color나 language가 없어서 어느 집합에도 못 들어감 }; 이처럼 Union 타입은 "적어도 하나의 타입 조건은 완벽히 갖춰야 한다" 는 것을 그림으로 기억하면 쉽다 . --- 2. 교집합 - Intersection 타입 (&) Intersection 타입은 "A이면서 동시에 B이다 (AND)" 를 의미한다. 집합으로 표현하면 두 원형이 겹치는 부분(교집합) 만이 유효한 타입의 범위가 된다. 2-1. 시각적 개념도 Dog & Person 타입을 그림으로 보면 가운데 겹친 부분만 색칠된다. Plaintext [ Dog & Person (Intersection) ] ( Dog ) ( Person ) ╭─────────────╮ ╭─────────────╮ │ │ 빗 │ │ │ (Invalid) │ 금 │ (Invalid) │ │ │ 칠 │ │ │ Dog만 있어도 │ 한 │ Person만 │ │ 탈락! │ 곳 │ 있어도 탈락! │ │ │ 만 │ │ ╰─────────────╯ OK ╰─────────────╯ 2-2. 객체 타입 합성 (프로퍼티 합치기) Intersection 타입은 두 집합의 모든 속성을 다 가지고 있어야 교집합 영역(가운데)에 들어갈 수 있다. 즉, 프로퍼티가 합쳐지는 효과가 난다. TypeScript type Dog = { name: string; color: string; }; type Person = { name: string; language: string; }; type Inter = Dog & Person; 이 타입이 되려면 Dog의 조건과 Person의 조건을 동시에 만족해야 한다. TypeScript let hybrid: Inter = { name: "개사람", color: "brown", // Dog의 조건 language: "woof", // Person의 조건 }; 결국 Intersection 타입은 객체에서 "모든 프로퍼티를 다 때려 넣은 슈퍼 객체" 를 만들 때 사용된다고 이해하면 된다. 2-3. 기본 타입의 교집합 (never) 만약 서로 겹칠 수 없는 타입끼리 교집합을 만들면 어떻게 될까? TypeScript let nothing: number & string; Plaintext [ number ] [ string ] ╭────────╮ ╭────────╮ │ 1 │ │ "a" │ │ 2 │ X │ "b" │ ╰────────╯ ╰────────╯ 서로 겹치는 부분이 없음 (공집합) 숫자이면서 동시에 문자인 값은 존재하지 않는다. 교집합이 없으므로 이 타입은 never (공집합) 가 된다. --- 요약 1. Union (|): 두 원을 모두 색칠한 그림. 하나만 만족해도 통과. 2. Intersection (&): 두 원의 가운데만 색칠한 그림. 모든 조건을 다 만족해야 통과 (프로퍼티 합체).

TypeScriptStudyTypeSystemUnionIntersection