UNION / INTERSECTION

유니온은 하나를 고르고, 인터섹션은 모두 만족한다

|는 가능한 타입 후보를 넓히고, &는 필요한 속성 조건을 합친다. 둘의 차이를 알면 API 응답과 객체 조합 타입을 안전하게 설계할 수 있다.

Union A 또는 B
Narrowing 검사 후 타입 확정
Intersection A와 B 모두
| 후보 중 하나만 만족
& 양쪽 조건을 모두 만족
never 충돌하면 불가능한 타입

관계 자체가 다르다

유니온은 값의 가능한 형태를 나열하고, 인터섹션은 객체가 가져야 할 조건을 합친다.

Union

string | number

값은 문자열이거나 숫자다. 사용 전에는 두 타입의 공통 동작만 바로 안전하다.

string | number 둘 중 하나의 형태로 들어온다
type UserId = string | number;
Intersection

Employee & Person

값은 직원 정보와 사람 정보를 모두 가져야 한다. 빠진 속성이 있으면 오류다.

Employee & Person 양쪽 속성을 모두 포함한다
type Manager = Employee & Person;

유니온은 좁힌 뒤 사용한다

후보가 여러 개일 때는 런타임 검사로 안전한 코드 블록을 만든다.

typeof

원시 타입 분기

string | number처럼 원시 타입 후보를 구분할 때 쓴다.

if (typeof id === "string") {
  id.toUpperCase();
}
discriminant

상태 필드로 분기

status 같은 공통 리터럴 속성으로 API 응답을 안전하게 나눈다.

if (res.status === "success") {
  res.data;
}
in

속성 존재 검사

객체 후보 중 특정 속성이 있는 타입으로 좁힐 때 사용한다.

if ("message" in res) {
  res.message;
}

언제 무엇을 쓰나

선택지를 표현할지, 능력을 결합할지 먼저 고르면 기호가 자연스럽게 정해진다.

API 결과

성공 또는 실패

응답이 여러 형태 중 하나라면 유니온으로 표현하고 식별 필드로 좁힌다.

역할 결합

User와 권한 모두

기본 사용자 속성과 관리자 기능이 모두 필요하면 인터섹션이 맞다.

충돌 주의

같은 속성의 다른 타입

{a:string} & {a:number}처럼 충돌하면 anever가 된다.