A class or interface with multiple cohesive sub-concepts inside it — Person carrying officeAreaCode + officeNumber + telephoneNumber() method, where Phone is hiding.
A cohesive sub-concept inside a class or interface becomes its own type with its own name, fields, and methods.
Before the refactoring
class Person {name;officeAreaCode;officeNumber;telephoneNumber() { return `(${this.officeAreaCode}) ${this.officeNumber}`; }}
After the refactoring
class Phone {areaCode;number;toString() { return `(${this.areaCode}) ${this.number}`; }}class Person { name; phone; }
The parent type's surface grows past what one type should own; tests touch unrelated concerns together; changes to one concept risk side effects on another.
Premature extraction adds ceremony — extract when 3+ fields and at least one operation cluster around a single concept that the parent type doesn't own.
Each type has one purpose; tests target the small unit; the parent type shrinks.
Extracting when the candidate concept is just 1-2 fields without behavior — adds a file with no encapsulation gain.