유니언 타입(Union Type, A | B)은 "A이거나 B인 값"이고, 인터섹션 타입(Intersection Type, A & B)은 "A이면서 B인 값"이다. 리터럴 타입(Literal Type)은 'left'나 3처럼 특정 값 하나만 허용하는 타입이다.
type Align = 'left' | 'right' | 'center' // 리터럴 유니언
type Admin = { name: string; privileges: string[] }
type Employee = { name: string; startDate: Date }
type Elevated = Admin & Employee // 속성이 합쳐짐- 이름이 헷갈리는 이유: 유니언은 값의 집합에서 합집합이다. 그런데 "모자 쓴 키 큰 사람 방"과 "모자 쓴 스페인어 쓰는 사람 방"을 합치면, 모두에 대해 확실한 사실은 "모자를 썼다"뿐이다. 그래서 유니언 값에서는 공통 속성만 바로 쓸 수 있고, 나머지는 좁힌 뒤 쓴다
- 객체끼리의
&는 속성이 합쳐지지만, 유니언끼리의&는 공통 멤버만 남는다:(string | number) & (number | boolean)은number - 같은 이름 속성의 타입이 충돌하는 객체를
&로 합치면 그 속성이never가 되기 쉽다. 속성을 교체하려면 Omit으로 지운 뒤 합친다 - 객체 전체를 리터럴 타입으로 고정하려면
as const를 쓴다 - 리터럴 구분 필드를 가진 유니언은 판별 유니언이 되어 상태 모델링에 강력하다
- interface의
extends와&의 차이는 type과 interface