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.