Type-Level Immutability in TypeScript with readonly
đź’ˇIntro
When you want to make sure no one mutates your types, readonly
is your tool.
đź§ Context
Unlike as const
, which applies at the value level, readonly
applies immutability at the type level. It prevents accidental mutations in objects, arrays, and class properties.
📌Intro
In React apps, readonly
ensures props, API response types, and shared objects remain untouched.
❓Why Use This?
- Prevents runtime bugs by forbidding mutation.
- Useful for API response modeling.
- Guarantees immutability in large codebases.
📝With vs Without Example
// Without readonly interface User { name: string; age: number; } let user: User = { name: "Arka", age: 22 }; user.age = 23; // Allowed
// With readonly interface User { readonly name: string; readonly age: number; } let user: User = { name: "Arka", age: 22 }; user.age = 23; // Error: cannot assign
📌Real Life Use Cases
React Props
type ProfileProps = { readonly name: string; readonly skills: readonly string[]; }; function Profile({ name, skills }: ProfileProps) { // Cannot mutate skills inside return <div>{skills.join(", ")}</div>; }
API Response
type ApiResponse = { readonly id: number; readonly status: "success" | "error"; };
readonly
ensures compile-time safety. It does not make runtime data truly immutable, it just prevents mutation in code.
Top comments (0)