Bird
Raised Fist0
Typescriptprogramming~20 mins

Readonly utility type in Typescript - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Readonly Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this TypeScript code using Readonly?
Consider the following TypeScript code using the Readonly utility type. What will be logged to the console?
Typescript
interface User {
  name: string;
  age: number;
}

const user: Readonly<User> = { name: "Alice", age: 30 };

// user.age = 31; // Uncommenting this line causes an error

console.log(user.age);
Aundefined
B31
C30
DCompilation error
Attempts:
2 left
💡 Hint
Readonly makes all properties immutable, so you cannot change them after initialization.
🧠 Conceptual
intermediate
1:30remaining
What does the Readonly utility type do in TypeScript?
Choose the best description of what the Readonly utility type does.
AIt makes all properties of a type optional.
BIt converts all properties of a type to strings.
CIt removes all properties from a type.
DIt makes all properties of a type immutable (read-only).
Attempts:
2 left
💡 Hint
Think about what 'readonly' means in everyday life.
🔧 Debug
advanced
2:00remaining
What error does this code produce?
Examine this TypeScript code snippet. What error will the compiler show?
Typescript
type Person = {
  name: string;
  age: number;
};

const person: Readonly<Person> = { name: "Bob", age: 25 };
person.age = 26;
ASyntaxError: Unexpected token '='.
BCannot assign to 'age' because it is a read-only property.
CNo error, code runs fine.
DReferenceError: person is not defined.
Attempts:
2 left
💡 Hint
Readonly properties cannot be assigned new values.
🚀 Application
advanced
2:30remaining
How to make a nested object fully readonly?
Given this nested object type, which approach correctly makes all nested properties readonly in TypeScript?
Typescript
type Profile = {
  user: {
    name: string;
    address: {
      city: string;
      zip: number;
    };
  };
};
A
type ReadonlyProfile = {
  readonly user: {
    readonly name: string;
    readonly address: {
      readonly city: string;
      readonly zip: number;
    };
  };
};
Btype ReadonlyProfile = Readonly<Profile>;
Ctype ReadonlyProfile = Readonly<Profile> & Readonly<Profile['user']> & Readonly<Profile['user']['address']>;
Dtype ReadonlyProfile = Readonly<Profile> & { user: Readonly<Profile['user']> };
Attempts:
2 left
💡 Hint
Readonly only applies shallowly by default.
❓ Predict Output
expert
2:30remaining
What is the output of this code using Readonly and mutation?
Analyze this TypeScript code. What will be the output when running it in JavaScript after compilation?
Typescript
type Data = {
  value: number;
  nested: {
    count: number;
  };
};

const data: Readonly<Data> = { value: 10, nested: { count: 5 } };

// data.value = 20; // Error: cannot assign to readonly

data.nested.count = 6;

console.log(data.nested.count);
A6
B5
CCompilation error
DRuntime error
Attempts:
2 left
💡 Hint
Readonly is shallow; nested objects are not deeply frozen.

Practice

(1/5)
1. What does the Readonly utility type do in TypeScript?
easy
A. Makes all properties optional
B. Allows properties to be changed only once
C. Removes all properties from an object type
D. Makes all properties of an object type unchangeable

Solution

  1. Step 1: Understand the purpose of Readonly

    The Readonly utility type is designed to make all properties of an object type immutable, meaning they cannot be changed after initialization.
  2. Step 2: Compare with other options

    Options B, C, and D describe behaviors that are not related to Readonly. Only Makes all properties of an object type unchangeable correctly describes making properties unchangeable.
  3. Final Answer:

    Makes all properties of an object type unchangeable -> Option D
  4. Quick Check:

    Readonly = makes properties unchangeable [OK]
Hint: Readonly means no changes allowed to object properties [OK]
Common Mistakes:
  • Thinking Readonly allows one-time changes
  • Confusing Readonly with Partial or Required types
  • Believing Readonly removes properties
2. Which of the following is the correct syntax to create a readonly type from an interface User?
easy
A. type ReadonlyUser = Readonly<User>();
B. type ReadonlyUser = Readonly<User>;
C. type ReadonlyUser = readonly User;
D. type ReadonlyUser = Readonly<User>[];

Solution

  1. Step 1: Recall the syntax of Readonly utility

    The correct syntax to create a readonly version of a type or interface is Readonly<TypeName> without parentheses or array brackets.
  2. Step 2: Analyze each option

    type ReadonlyUser = Readonly<User>; uses the correct generic syntax. type ReadonlyUser = Readonly<User>(); incorrectly uses parentheses. type ReadonlyUser = readonly User; uses lowercase 'readonly' which is a keyword for arrays or tuples, not for types. type ReadonlyUser = Readonly<User>[]; creates an array of readonly users, which is different.
  3. Final Answer:

    type ReadonlyUser = Readonly<User>; -> Option B
  4. Quick Check:

    Readonly syntax = Readonly<Type> [OK]
Hint: Use Readonly<Type> without parentheses or brackets [OK]
Common Mistakes:
  • Adding parentheses after Readonly
  • Using lowercase 'readonly' instead of utility type
  • Confusing array of readonly with readonly type
3. What will be the output of the following TypeScript code?
interface Config {
  url: string;
  timeout: number;
}

const config: Readonly<Config> = { url: 'api.com', timeout: 5000 };

config.timeout = 3000;
console.log(config.timeout);
medium
A. Compilation error
B. 5000
C. 3000
D. undefined

Solution

  1. Step 1: Understand Readonly effect on assignment

    The Readonly type makes all properties immutable. Trying to assign a new value to config.timeout will cause a compilation error.
  2. Step 2: Check the code behavior

    The line config.timeout = 3000; is invalid and TypeScript will not compile this code, so no runtime output occurs.
  3. Final Answer:

    Compilation error -> Option A
  4. Quick Check:

    Readonly blocks property assignment = Compilation error [OK]
Hint: Readonly properties cannot be assigned new values [OK]
Common Mistakes:
  • Assuming readonly allows property changes
  • Expecting old value printed despite error
  • Confusing runtime error with compile error
4. Identify the error in this TypeScript code using Readonly and fix it:
interface Point {
  x: number;
  y: number;
}

const p: Readonly<Point> = { x: 10, y: 20 };
p.x = 15;
console.log(p.x);
medium
A. Change p.x = 15; to p = { x: 15, y: 20 };
B. Use as const instead of Readonly
C. Remove Readonly to allow property changes
D. Declare p as let instead of const

Solution

  1. Step 1: Identify why assignment fails

    The Readonly type prevents changing properties like p.x</>. The error is caused by trying to assign p.x = 15;.
  2. Step 2: Fix by removing Readonly

    Removing Readonly allows property changes. Options A, B, and D do not fix the core problem of property immutability.
  3. Final Answer:

    Remove Readonly to allow property changes -> Option C
  4. Quick Check:

    Readonly blocks property assignment; remove it to fix [OK]
Hint: Remove Readonly to allow property updates [OK]
Common Mistakes:
  • Trying to assign to readonly property instead of removing Readonly
  • Using 'as const' which makes object deeply readonly
  • Changing variable declaration without fixing immutability
5. Given this nested object type, how can you make all properties readonly including nested ones?
interface Settings {
  theme: string;
  layout: {
    header: boolean;
    footer: boolean;
  };
}
hard
A. Use a custom DeepReadonly type that recursively applies Readonly
B. Use Partial<Settings> to make properties readonly
C. Use readonly Settings keyword
D. Use Readonly<Settings> only

Solution

  1. Step 1: Understand shallow vs deep readonly

    The built-in Readonly utility only makes the top-level properties readonly. Nested objects remain mutable.
  2. Step 2: Use a recursive DeepReadonly type

    To make nested properties readonly, you need a custom type that applies Readonly recursively to all nested objects.
  3. Final Answer:

    Use a custom DeepReadonly type that recursively applies Readonly -> Option A
  4. Quick Check:

    Readonly is shallow; use DeepReadonly for nested [OK]
Hint: Readonly is shallow; use recursive type for nested readonly [OK]
Common Mistakes:
  • Assuming Readonly makes nested properties readonly
  • Using 'readonly' keyword incorrectly on types
  • Confusing Partial with Readonly
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