Intersections
| Combine with & | |
| Mixin behavior | |
| Intersection vs union | |
| Flatten carefully |
Combine with &
An intersection glues two object types together with the & sign. The result has every field from both sides at once.
Person has name from Named and age from Aged, so the const ada must provide both fields.
type Named = {
name: string;
};
type Aged = {
age: number;
};
type Person = Named & Aged;
const ada: Person = { name: "Ada", age: 36 };
Mixin behavior
A mixin is a small reusable piece of data added to many types. Timestamped can be mixed into articles, comments, and anything else with a creation date.
Article keeps its own title and gains createdAt from the mixin. Each side stays small and easy to reuse.
type Timestamped = {
createdAt: string;
};
type Article = {
title: string;
} & Timestamped;
const post: Article = {
title: "Hello",
createdAt: "2026-01-01",
};
Intersection vs union
Unions and intersections answer opposite questions. A union value may be one side or the other, while an intersection value must satisfy every side at once.
Either accepts an a object or a b object, but Both demands a and b together. Pick the one that matches the real rule.
type Either = { a: string } | { b: number };
type Both = { a: string } & { b: number };
const both: Both = { a: "x", b: 2 };
Flatten carefully
Intersections of clashing fields collapse to never, which no value can satisfy. A Conflict with id as both string and number can never be built.
Keep intersections flat and group related fields into one base type instead. Small named pieces compose without surprises.
type Conflict = { id: string } & { id: number };
// id is never, so no value fits
type Clean = { id: string } & { label: string };
const ok: Clean = { id: "a1", label: "first" };
Next: Mapped types
Article author: Arthur Isaev