Bird
Raised Fist0
Typescriptprogramming~20 mins

Why mapped types are needed in Typescript - Challenge Your Understanding

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Mapped Types Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of a mapped type usage
What is the output of the following TypeScript code when compiled and run with Node.js (ignoring type errors)?
Typescript
type OptionsFlags<Type> = {
  [Property in keyof Type]: boolean;
};

interface Features {
  darkMode: () => void;
  newUserProfile: () => void;
}

const featureOptions: OptionsFlags<Features> = {
  darkMode: true,
  newUserProfile: false
};

console.log(featureOptions);
ATypeError at runtime
B{"darkMode":true,"newUserProfile":false}
C{"darkMode":() => void,"newUserProfile":() => void}
DSyntaxError during compilation
Attempts:
2 left
💡 Hint
Mapped types transform property types, here to boolean values.
🧠 Conceptual
intermediate
1:30remaining
Purpose of mapped types in TypeScript
Why are mapped types needed in TypeScript?
ATo define runtime classes with inheritance.
BTo execute asynchronous code more efficiently.
CTo create new types by transforming properties of existing types systematically.
DTo handle errors during program execution.
Attempts:
2 left
💡 Hint
Think about how you can reuse and modify existing type structures.
🔧 Debug
advanced
2:30remaining
Identify the error in mapped type usage
What error does this TypeScript code produce?
Typescript
type Readonly<T> = {
  readonly [P in keyof T];
};

interface User {
  name: string;
  age: number;
}

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

user.age = 31;
ANo error, code runs fine
BReferenceError: user is not defined
CTypeError: Cannot assign to 'age' because it is a read-only property
DSyntaxError: Missing type annotation after property in mapped type
Attempts:
2 left
💡 Hint
Check the syntax of the mapped type declaration.
❓ Predict Output
advanced
2:00remaining
Output of conditional mapped type
What is the output of this TypeScript code when compiled and run with Node.js (ignoring type errors)?
Typescript
type RemoveFunctions<T> = {
  [P in keyof T as T[P] extends Function ? never : P]: T[P];
};

interface Mixed {
  id: number;
  name: string;
  greet: () => void;
}

const obj: RemoveFunctions<Mixed> = {
  id: 1,
  name: "Bob"
};

console.log(obj);
A{"id":1,"name":"Bob"}
BTypeError at runtime
CSyntaxError during compilation
D{"id":1,"name":"Bob","greet":undefined}
Attempts:
2 left
💡 Hint
The mapped type uses conditional key remapping to exclude function properties.
🧠 Conceptual
expert
2:00remaining
Why mapped types improve code maintainability
How do mapped types improve code maintainability in large TypeScript projects?
ABy allowing centralized and consistent transformations of types, reducing duplication and errors.
BBy automatically optimizing runtime performance of JavaScript code.
CBy replacing the need for interfaces and classes entirely.
DBy enabling dynamic type changes during program execution.
Attempts:
2 left
💡 Hint
Think about how changing one type definition affects many related types.

Practice

(1/5)
1. Why are mapped types needed in TypeScript?
easy
A. To create new types by transforming all properties of an existing type easily
B. To write functions that return multiple values
C. To define classes with private members
D. To handle asynchronous operations

Solution

  1. Step 1: Understand the purpose of mapped types

    Mapped types allow you to take an existing type and create a new type by changing all its properties in a consistent way.
  2. Step 2: Compare with other options

    Options B, C, and D relate to other TypeScript or JavaScript features but do not describe mapped types.
  3. Final Answer:

    To create new types by transforming all properties of an existing type easily -> Option A
  4. Quick Check:

    Mapped types = transform all properties easily [OK]
Hint: Mapped types transform all properties of a type at once [OK]
Common Mistakes:
  • Confusing mapped types with functions or classes
  • Thinking mapped types handle async code
  • Believing mapped types define private members
2. Which of the following is the correct syntax to create a mapped type that makes all properties of T readonly?
easy
A. type Readonly<T> = { [P in T]: readonly T[P] }
B. type Readonly<T> = { [P in keyof T]: readonly T[P] }
C. type Readonly<T> = { readonly T[P] in keyof T }
D. type Readonly<T> = { readonly [P in keyof T]: T[P] }

Solution

  1. Step 1: Analyze mapped type syntax

    The correct syntax uses [P in keyof T] to iterate over keys and applies readonly before the property name.
  2. Step 2: Identify errors in other options

    type Readonly<T> = { [P in keyof T]: readonly T[P] } incorrectly places readonly after the colon. type Readonly<T> = { [P in T]: readonly T[P] } uses [P in T] which is invalid. type Readonly<T> = { readonly T[P] in keyof T } has incorrect order and syntax.
  3. Final Answer:

    type Readonly<T> = { readonly [P in keyof T]: T[P] } -> Option D
  4. Quick Check:

    Mapped type syntax = readonly before [P in keyof T] [OK]
Hint: Use 'readonly [P in keyof T]' to make properties readonly [OK]
Common Mistakes:
  • Placing readonly after the property type
  • Using wrong iteration syntax like [P in T]
  • Misordering readonly and the mapped key
3. Given the code below, what is the type of OptionalUser?
type User = { id: number; name: string; };
type OptionalUser = { [P in keyof User]?: User[P] };
medium
A. { id: number; name: string; }
B. { id: number | undefined; name: string | undefined; }
C. { id?: number; name?: string; }
D. Error: Invalid mapped type syntax

Solution

  1. Step 1: Understand the mapped type with optional modifier

    The ? after [P in keyof User] makes each property optional.
  2. Step 2: Compare with options

    { id?: number; name?: string; } correctly shows all properties optional. { id: number; name: string; } is original type. { id: number | undefined; name: string | undefined; } uses union with undefined which is different. Error: Invalid mapped type syntax is incorrect as syntax is valid.
  3. Final Answer:

    { id?: number; name?: string; } -> Option C
  4. Quick Check:

    Mapped type with ? = all properties optional [OK]
Hint: Adding ? after [P in keyof T] makes properties optional [OK]
Common Mistakes:
  • Confusing optional properties with union types
  • Thinking original type remains unchanged
  • Assuming syntax error in mapped types
4. Identify the error in the following mapped type and fix it:
type ReadonlyUser<T> = { [P in keyof T] T[P] readonly }
medium
A. Remove readonly modifier completely
B. The readonly modifier should come before the property name: { readonly [P in keyof T]: T[P] }
C. Change keyof T to keyof User
D. Add a semicolon after T[P]

Solution

  1. Step 1: Check mapped type syntax

    The readonly modifier must be placed before the property name in mapped types.
  2. Step 2: Correct the syntax

    Rewrite as { readonly [P in keyof T]: T[P] } to fix the error.
  3. Final Answer:

    The readonly modifier should come before the property name: { readonly [P in keyof T]: T[P] } -> Option B
  4. Quick Check:

    readonly before [P in keyof T] fixes syntax [OK]
Hint: Place readonly before the mapped key, not after the type [OK]
Common Mistakes:
  • Putting readonly after the property type
  • Confusing property name and type order
  • Ignoring mapped type syntax rules
5. You want to create a mapped type that converts all properties of a type T to strings, regardless of their original type. Which mapped type correctly achieves this?
hard
A. type Stringify<T> = { [P in keyof T]: string }
B. type Stringify<T> = { [P in keyof T]: T[P] extends string ? string : never }
C. type Stringify<T> = { [P in keyof T]: T[P] & string }
D. type Stringify<T> = { [P in keyof T]: keyof string }

Solution

  1. Step 1: Understand the goal

    We want all properties to become type string, ignoring original types.
  2. Step 2: Analyze each option

    type Stringify<T> = { [P in keyof T]: string } sets every property to string directly. type Stringify<T> = { [P in keyof T]: T[P] extends string ? string : never } uses conditional types but returns never for non-string types, which is incorrect. type Stringify<T> = { [P in keyof T]: T[P] & string } intersects with string, which does not convert types. type Stringify<T> = { [P in keyof T]: keyof string } uses keyof string which is invalid.
  3. Final Answer:

    type Stringify<T> = { [P in keyof T]: string } -> Option A
  4. Quick Check:

    Assign string directly to all properties [OK]
Hint: Assign string type directly to all keys in mapped type [OK]
Common Mistakes:
  • Using conditional types incorrectly
  • Trying to intersect types instead of replacing
  • Misusing keyof operator on primitive types
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