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)