Advanced Type Patterns
Intersection Types
Intersection types combine requirements from multiple object types into one value.
intersection type
An intersection type such as `User & AuditInfo` requires members from both types.
Intersection Types
intersections.ts
Replay: real traced execution (multi-file project)
type User = {
name: string;
};
type AuditInfo = {
role: string;
active: boolean;
};
type AuditedUser = User & AuditInfo;
function summary(user: AuditedUser): string {
const state: string = user.active ? "active" : "inactive";
return `${user.name}:${user.role}:${state}`;
}
const active: boolean = true;
const user: AuditedUser = { name: "Ada", role: "admin", active: active };
console.log(summary(user));
type User = {
name: string;
};
type AuditInfo = {
role: string;
active: boolean;
};
type AuditedUser = User & AuditInfo;
function summary(user: AuditedUser): string {
const state: string = user.active ? "active" : "inactive";
return `${user.name}:${user.role}:${state}`;
}
const active: boolean = false;
const user: AuditedUser = { name: "Ada", role: "admin", active: active };
console.log(summary(user));
active ← true, user ← [object Object]
14 return `${user.name}:${user.role}:${state}`;15}1617const active→ true: boolean = true; //@active=false18const user→ [object Object]: AuditedUser = { name: "Ada", role: "admin", active: activetrue };1920console.log(summary(user[object Object]));state ← active
10type AuditedUser = User & AuditInfo;1112function summary(user[object Object]: AuditedUser): string {13 const state→ active: string = user.activetrue ? "active" : "inactive";14 return `${user.nameAda}:${user.roleadmin}:${stateactive}`;15}console.log(summary(user));
17const active: boolean = true; //@active=false18const user: AuditedUser = { name: "Ada", role: "admin", active: active };1920console.log(summary(user[object Object]));outputAda:admin:active
active ← false, user ← [object Object]
14 return `${user.name}:${user.role}:${state}`;15}1617const active→ false: boolean = false;18const user→ [object Object]: AuditedUser = { name: "Ada", role: "admin", active: activefalse };1920console.log(summary(user[object Object]));state ← inactive
10type AuditedUser = User & AuditInfo;1112function summary(user[object Object]: AuditedUser): string {13 const state→ inactive: string = user.activefalse ? "active" : "inactive";14 return `${user.nameAda}:${user.roleadmin}:${stateinactive}`;15}console.log(summary(user));
17const active: boolean = false;18const user: AuditedUser = { name: "Ada", role: "admin", active: active };1920console.log(summary(user[object Object]));outputAda:admin:inactive