"Intersection 은 모든 부분에서 모든 property 가진 타입. 모양 composing 하는 법."
Intersection 이 묘사하는 것
Intersection 타입 A & B 가 A 의 모든 멤버 AND B 의 모든 멤버 가진 값 묘사. Object 타입엔 이게 composition: 결과가 두 부분의 모든 property 가짐, 충돌하는 property 는 호환돼야 함.
Primitive 엔 intersection 거의 말 안 됨 — string & number 가 값 없음 (어떤 값도 string 이고 number 아님), 그래서 `never` 됨. Object 모양엔 intersection 이 일꾼: 공유 base 타입과 role-specific 확장 결합.
Composition 패턴
고전 모양: type Admin = User & { permissions: string[] }. 결과는 `User` 플러스 `permissions` 필드. `interface Admin extends User { permissions: string[] }` 와 동등, 근데 type alias 로 작동하고 더 유연하게 compose.
다중 intersection 흔함: type AuditedAdmin = User & Timestamped & Admin. 순서 안 중요 — intersection 이 associative + commutative. 결과가 모든 기여 타입의 모든 property 가짐.
Branded 타입 — 유명한 use case
Intersection 이 branded 타입 작동 법: type UserId = number & { __brand: 'UserId' }. 고유 tag 와 `number` 의 intersection 이 runtime 에 여전히 number 인 nominally-distinct 타입 만들어. 이 패턴 structural-typing lesson 에 나타나 — 그리고 intersection 이 가능하게 함.