What if a simple keyword could protect your data from accidental changes forever?
Why Readonly properties in interfaces in Typescript? - Purpose & Use Cases
Imagine you are building a form where users enter their profile data. You want to make sure some fields, like user ID, never change after creation. Without readonly properties, you have to constantly check and prevent accidental changes manually.
Manually tracking which properties should not change is slow and error-prone. You might forget to add checks everywhere, leading to bugs where important data is accidentally modified. This makes your code fragile and hard to maintain.
Readonly properties in interfaces let you declare which fields cannot be changed after they are set. The TypeScript compiler then helps you by giving errors if you try to modify those fields, keeping your data safe automatically.
interface User { id: number; name: string; }
const user: User = { id: 1, name: 'Alice' };
user.id = 2; // Oops, no error, but should not changeinterface User { readonly id: number; name: string; }
const user: User = { id: 1, name: 'Alice' };
user.id = 2; // Error: Cannot assign to 'id' because it is a read-only propertyThis lets you write safer code by clearly marking data that should never change, preventing bugs before they happen.
In a banking app, account numbers should never change once assigned. Using readonly properties ensures these critical values stay constant throughout the app.
Readonly properties prevent accidental changes to important data.
They help catch errors early during development.
Using them makes your code more reliable and easier to maintain.
Practice
What does the readonly keyword do when used in a TypeScript interface property?
Solution
Step 1: Understand the purpose of
Thereadonlyin interfacesreadonlykeyword marks a property so it cannot be reassigned after the object is created.Step 2: Compare with other options
Options A, B, and D describe different behaviors: A makes optional, B allows changes, D changes visibility, none of which matchreadonly.Final Answer:
Prevents the property from being changed after initialization -> Option AQuick Check:
readonlymeans no changes allowed after creation [OK]
- Thinking readonly makes property optional
- Confusing readonly with private or protected
- Assuming readonly allows reassignment
Which of the following is the correct syntax to declare a readonly property id of type number in a TypeScript interface?
interface User {
?
}Solution
Step 1: Recall correct readonly syntax in interfaces
The correct syntax placesreadonlybefore the property name, then a colon and the type.Step 2: Check each option
readonly id: number; matches the correct syntax. Options A, B, and C have incorrect order or misplaced keywords.Final Answer:
readonly id: number; -> Option DQuick Check:
Readonly keyword comes before property name [OK]
- Placing readonly after property name
- Using readonly as a type
- Misplacing colons or semicolons
Consider the following code:
interface Point {
readonly x: number;
readonly y: number;
}
const p: Point = { x: 10, y: 20 };
p.x = 30;
console.log(p.x);What will happen when this code runs?
Solution
Step 1: Understand readonly behavior at compile time
TypeScript prevents assigning a new value to a readonly property during compilation, causing an error before running.Step 2: Check runtime behavior
Since TypeScript errors stop compilation, the code won't run, so no runtime error or output occurs.Final Answer:
Compile-time error due to assignment to readonly property -> Option CQuick Check:
Readonly blocks assignment at compile time [OK]
- Thinking readonly allows reassignment at runtime
- Expecting runtime error instead of compile error
- Assuming original value changes silently
Find the error in this code snippet:
interface Config {
readonly url: string;
}
const config: Config = { url: "https://api.com" };
config.url = "https://newapi.com";Solution
Step 1: Identify the readonly property usage
The propertyurlis marked readonly, so it cannot be reassigned after initialization.Step 2: Check the assignment line
The lineconfig.url = "https://newapi.com";tries to change a readonly property, causing a compile-time error.Final Answer:
Cannot assign to 'url' because it is a readonly property -> Option AQuick Check:
Readonly properties cannot be reassigned [OK]
- Ignoring readonly and trying to reassign
- Confusing readonly with optional properties
- Thinking semicolon or type is the error
You want to create an interface Person with a readonly id and a mutable name. Which code correctly enforces this?
?
Solution
Step 1: Define readonly and mutable properties correctly
Thereadonlykeyword must be before the property name to make it immutable; properties without it remain mutable.Step 2: Evaluate each option
interface Person { readonly id: number; name: string; } correctly marksidas readonly andnameas mutable. Options B, C, and D misuse readonly or make both properties readonly.Final Answer:
interface Person { readonly id: number; name: string; } -> Option BQuick Check:
Readonly before property name only for immutable fields [OK]
- Placing readonly after property name or type
- Making all properties readonly by mistake
- Confusing readonly with type annotations
Ready to prove it?
Pass the test and this pattern moves unknown
