Intersection Types
Introduction to Intersection Types
Intersection types are created with the & operator.
Intersection behaves differently if used with literal types vs object types.
The & operator behaves like an and operation for literal types, but as an union operation for object types.
Intersection of non non-object types
type T = string & number;
// type T = never
The resulting type is never because T cannot possibly be both string and number.
In this case, the name “intersection” makes sense.
There is no intersection between string and number.
Intersection of object types
However, this creates an union of the type constituents:
type BaseConfig = {
url: string;
version: number;
}
type U = BaseConfig & { headers: Record<string, string> };
// type U = BaseConfig & {
// headers: Record<string, string>;
// }

It is as if we had done this:
type U = {
url: string;
version: number;
headers: Record<string, string>;
};
In this case, & really behaves like an union of the type constituents, not like an intersection.