Learn how to build recursive type definitions for nested tree structures and enforce deep immutability across object graphs.
Discover how TypeScript infers types automatically and how let versus const declarations shape wide types versus narrow literal types.
Built-in Readonly<T> only marks top-level properties as read-only. For deeply nested object graphs (like state trees or JSON configs), you need Deep Readonly recursive types.
A type alias is recursive when it refers to itself inside its own definition. This is ideal for modeling JSON values or folder tree structures:
// Recursive JSON Value Type
type JSONValue =
| string
| number
| boolean
| null
| JSONValue[]
| { [key: string]: JSONValue };
const configData: JSONValue = {
appName: "DevLoom",
versions: [1, 2, 3],
nested: {
enabled: true,
},
};
Map through object properties recursively to enforce immutability at all nesting levels:
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};
type AppState = {
user: {
profile: {
name: string;
};
};
};
const state: DeepReadonly<AppState> = {
user: { profile: { name: "Alex" } },
};
// state.user.profile.name = "New Name"; // Error: Cannot assign to read-only property!
T[K] extends object before recursing!Use recursive types for complex state trees. Next, let's enter Phase 4 and explore Classes, Access Modifiers, and Implements!