Bird
Raised Fist0
Typescriptprogramming~10 mins

Readonly properties in interfaces in Typescript - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Readonly properties in interfaces
Define interface with readonly property
↓
Create object implementing interface
↓
Try to modify readonly property
↓
Error: Cannot assign
This flow shows defining an interface with a readonly property, creating an object from it, and what happens if you try to change that property.
Execution Sample
Typescript
interface User {
  readonly id: number;
  name: string;
}

const user: User = { id: 1, name: "Alice" };
user.id = 2; // Error here
Defines a User interface with a readonly id, creates a user object, then tries to change the readonly id property, causing an error.
Execution Table
StepActionEvaluationResult
1Define interface User with readonly id and nameInterface createdUser interface ready
2Create user object with id=1, name='Alice'Object matches interfaceuser = { id:1, name:'Alice' }
3Attempt to assign user.id = 2Check readonly propertyError: Cannot assign to 'id' because it is a read-only property.
💡 Execution stops due to error when trying to modify readonly property 'id'
Variable Tracker
VariableStartAfter 1After 2Final
userundefined{ id:1, name:'Alice' }{ id:1, name:'Alice' }Error on modification, user unchanged
Key Moments - 2 Insights
Why does trying to assign a new value to user.id cause an error?
Because 'id' is marked as readonly in the interface, TypeScript prevents any assignment to it after initialization, as shown in step 3 of the execution_table.
Can we change the 'name' property of user?
Yes, 'name' is not readonly, so it can be changed without error. The readonly restriction applies only to properties marked with 'readonly' in the interface.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what happens at step 3 when trying to assign user.id = 2?
AThe assignment succeeds and user.id becomes 2
BTypeScript throws an error because 'id' is readonly
CThe assignment is ignored silently
DThe program crashes at runtime
💡 Hint
Check the 'Result' column in step 3 of execution_table
According to variable_tracker, what is the value of user after step 2?
A{ id:1, name:'Alice' }
B{ id:2, name:'Alice' }
Cundefined
DError state
💡 Hint
Look at the 'After 2' column for 'user' in variable_tracker
If the 'readonly' keyword is removed from 'id' in the interface, what changes in the execution_table?
AStep 2 will fail to create the object
BStep 3 will still show an error
CStep 3 will show no error and assignment succeeds
DStep 1 will fail to define the interface
💡 Hint
Readonly keyword controls assignment errors as shown in step 3 of execution_table
Concept Snapshot
interface User {
  readonly id: number; // cannot change after init
  name: string;       // can change
}

Readonly properties prevent reassignment after object creation.
Trying to assign to them causes a compile-time error.
Use readonly to protect important data from accidental changes.
Full Transcript
This visual execution shows how readonly properties in TypeScript interfaces work. First, we define an interface User with a readonly id and a mutable name. Then, we create a user object with id 1 and name 'Alice'. When we try to assign a new value to user.id, TypeScript gives an error because id is readonly. The variable tracker confirms user stays unchanged after the failed assignment. Key points: readonly means you cannot change that property after creation, but other properties can be changed. The quiz questions check understanding of when errors happen and how readonly affects assignment.

Practice

(1/5)
1.

What does the readonly keyword do when used in a TypeScript interface property?

easy
A. Prevents the property from being changed after initialization
B. Allows the property to be changed anytime
C. Makes the property optional
D. Makes the property private

Solution

  1. Step 1: Understand the purpose of readonly in interfaces

    The readonly keyword marks a property so it cannot be reassigned after the object is created.
  2. 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 match readonly.
  3. Final Answer:

    Prevents the property from being changed after initialization -> Option A
  4. Quick Check:

    readonly means no changes allowed after creation [OK]
Hint: Readonly means no changes allowed after creation [OK]
Common Mistakes:
  • Thinking readonly makes property optional
  • Confusing readonly with private or protected
  • Assuming readonly allows reassignment
2.

Which of the following is the correct syntax to declare a readonly property id of type number in a TypeScript interface?

interface User {
?
}
easy
A. id: readonly number;
B. id readonly: number;
C. readonly: id number;
D. readonly id: number;

Solution

  1. Step 1: Recall correct readonly syntax in interfaces

    The correct syntax places readonly before the property name, then a colon and the type.
  2. Step 2: Check each option

    readonly id: number; matches the correct syntax. Options A, B, and C have incorrect order or misplaced keywords.
  3. Final Answer:

    readonly id: number; -> Option D
  4. Quick Check:

    Readonly keyword comes before property name [OK]
Hint: Put readonly before property name in interface [OK]
Common Mistakes:
  • Placing readonly after property name
  • Using readonly as a type
  • Misplacing colons or semicolons
3.

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?

medium
A. It will print 30
B. It will print 10
C. Compile-time error due to assignment to readonly property
D. Runtime error when assigning to readonly property

Solution

  1. 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.
  2. Step 2: Check runtime behavior

    Since TypeScript errors stop compilation, the code won't run, so no runtime error or output occurs.
  3. Final Answer:

    Compile-time error due to assignment to readonly property -> Option C
  4. Quick Check:

    Readonly blocks assignment at compile time [OK]
Hint: Readonly errors happen at compile time, not runtime [OK]
Common Mistakes:
  • Thinking readonly allows reassignment at runtime
  • Expecting runtime error instead of compile error
  • Assuming original value changes silently
4.

Find the error in this code snippet:

interface Config {
readonly url: string;
}

const config: Config = { url: "https://api.com" };
config.url = "https://newapi.com";
medium
A. Cannot assign to 'url' because it is a readonly property
B. Missing semicolon after interface declaration
C. Type mismatch: string assigned to readonly property
D. Interface properties cannot be initialized

Solution

  1. Step 1: Identify the readonly property usage

    The property url is marked readonly, so it cannot be reassigned after initialization.
  2. Step 2: Check the assignment line

    The line config.url = "https://newapi.com"; tries to change a readonly property, causing a compile-time error.
  3. Final Answer:

    Cannot assign to 'url' because it is a readonly property -> Option A
  4. Quick Check:

    Readonly properties cannot be reassigned [OK]
Hint: Readonly properties cause errors if reassigned [OK]
Common Mistakes:
  • Ignoring readonly and trying to reassign
  • Confusing readonly with optional properties
  • Thinking semicolon or type is the error
5.

You want to create an interface Person with a readonly id and a mutable name. Which code correctly enforces this?

?
hard
A. interface Person { id: readonly number; name: string; }
B. interface Person { readonly id: number; name: string; }
C. interface Person { readonly id: number; readonly name: string; }
D. interface Person { id: number; name: readonly string; }

Solution

  1. Step 1: Define readonly and mutable properties correctly

    The readonly keyword must be before the property name to make it immutable; properties without it remain mutable.
  2. Step 2: Evaluate each option

    interface Person { readonly id: number; name: string; } correctly marks id as readonly and name as mutable. Options B, C, and D misuse readonly or make both properties readonly.
  3. Final Answer:

    interface Person { readonly id: number; name: string; } -> Option B
  4. Quick Check:

    Readonly before property name only for immutable fields [OK]
Hint: Put readonly before only the properties you want fixed [OK]
Common Mistakes:
  • Placing readonly after property name or type
  • Making all properties readonly by mistake
  • Confusing readonly with type annotations
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard