"An intersection is a type that has every property from every part. It's how you compose shapes."
What intersections describe
An intersection type A & B describes a value that has all the members of A AND all the members of B. For object types, this is composition: the result has every property of both parts, with conflicting properties having to be compatible.
For primitives, intersection rarely makes sense — string & number has no values (no value is both a string and a number), so it becomes never. For object shapes, intersection is the workhorse: combining shared base types with role-specific extensions.
Composition patterns
The classic shape: type Admin = User & { permissions: string[] }. The result is User plus the permissions field. Equivalent to interface Admin extends User { permissions: string[] }, but works as a type alias and composes more flexibly.
Multiple intersections are common: type AuditedAdmin = User & Timestamped & Admin. The order doesn't matter — intersection is associative and commutative. The result has every property from every contributing type.
Branded types — the famous use case
Intersection is also how branded types work: type UserId = number & { __brand: 'UserId' }. The intersection of number with a unique tag makes a nominally-distinct type that's still a number at runtime. This pattern shows up in the structural-typing lesson — and it's intersection that makes it possible.