Bird
Raised Fist0
Typescriptprogramming~3 mins

Why Generic class syntax in Typescript? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if one class could safely handle any type of data without rewriting code?

The Scenario

Imagine you want to create a class that can store different types of data, like numbers, strings, or even custom objects. Without generics, you'd have to write a new class for each type or use a very loose type like any, which can cause mistakes.

The Problem

Writing separate classes for each data type is slow and repetitive. Using any removes type safety, so you might accidentally mix types and get errors only when running your code, making debugging hard and frustrating.

The Solution

Generic class syntax lets you write one flexible class that works with any data type while keeping type safety. You tell the class what type to use when creating it, so TypeScript helps catch mistakes early and saves you from writing repetitive code.

Before vs After
✗ Before
class NumberBox {
  value: number;
  constructor(value: number) {
    this.value = value;
  }
}

class StringBox {
  value: string;
  constructor(value: string) {
    this.value = value;
  }
}
✓ After
class Box<T> {
  value: T;
  constructor(value: T) {
    this.value = value;
  }
}
What It Enables

You can create reusable, type-safe classes that adapt to any data type, making your code cleaner and safer.

Real Life Example

Think of a storage box that can hold toys, books, or clothes. Instead of making a new box for each, you make one adjustable box that fits anything you want to store.

Key Takeaways

Writing separate classes for each type is slow and error-prone.

Generic classes let you write one flexible, reusable class.

This keeps your code safe and easier to maintain.

Practice

(1/5)
1. What does the <T> mean in a TypeScript generic class declaration like class Box<T> {}?
easy
A. It declares a placeholder type that can be replaced with any type when creating an instance.
B. It defines a fixed type named T that cannot be changed.
C. It is a syntax error and should be removed.
D. It specifies that the class only works with numbers.

Solution

  1. Step 1: Understand generic type parameter

    The <T> after the class name declares a generic type parameter named T, which acts as a placeholder for any type.
  2. Step 2: Purpose of generic classes

    This allows the class to work flexibly with any type specified when creating an instance, making the code reusable and type-safe.
  3. Final Answer:

    It declares a placeholder type that can be replaced with any type when creating an instance. -> Option A
  4. Quick Check:

    Generic <T> = placeholder type [OK]
Hint: Generic <T> means flexible type placeholder [OK]
Common Mistakes:
  • Thinking <T> fixes the type permanently
  • Confusing generic syntax with inheritance
  • Assuming <T> is a variable or value
2. Which of the following is the correct syntax to declare a generic class named Container with a type parameter T?
easy
A. class Container[T] {}
B. class Container(T) {}
C. class Container {T} {}
D. class Container<T> {}

Solution

  1. Step 1: Recall generic class syntax

    In TypeScript, generic classes use angle brackets <> to declare type parameters after the class name.
  2. Step 2: Match correct syntax

    The correct syntax is class Container<T> {}. Other options use parentheses, curly braces, or square brackets incorrectly.
  3. Final Answer:

    class Container<T> {} -> Option D
  4. Quick Check:

    Generic class uses <T> syntax [OK]
Hint: Generic classes use angle brackets <T> after name [OK]
Common Mistakes:
  • Using parentheses instead of angle brackets
  • Placing type parameter inside class body
  • Using square brackets which are for arrays
3. What is the output of this TypeScript code?
class Box<T> {
  content: T;
  constructor(value: T) {
    this.content = value;
  }
  getContent(): T {
    return this.content;
  }
}

const box = new Box<string>('hello');
console.log(box.getContent());
medium
A. Box { content: 'hello' }
B. undefined
C. hello
D. TypeError at runtime

Solution

  1. Step 1: Understand class instantiation

    The class Box<T> is instantiated with T = string, so content is a string holding 'hello'.
  2. Step 2: Trace method call

    The method getContent() returns the stored content, which is 'hello'. The console.log prints this string.
  3. Final Answer:

    hello -> Option C
  4. Quick Check:

    Generic class returns stored value 'hello' [OK]
Hint: Generic class returns stored value of specified type [OK]
Common Mistakes:
  • Expecting object print instead of string
  • Confusing property with method output
  • Thinking generic causes runtime error
4. Identify the error in this generic class code:
class Pair<T, U> {
  first: T;
  second: U;
  constructor(first: T, second: T) {
    this.first = first;
    this.second = second;
  }
}
medium
A. Constructor parameters should be (first: T, second: U) to match property types.
B. Generic parameters should be declared as <T> only, not .
C. Properties first and second must have the same type T.
D. Constructor cannot have parameters in a generic class.

Solution

  1. Step 1: Compare constructor parameters with property types

    The class declares two generic types T and U, with properties first: T and second: U.
  2. Step 2: Identify mismatch in constructor

    The constructor incorrectly uses second: T instead of second: U, causing a type mismatch.
  3. Final Answer:

    Constructor parameters should be (first: T, second: U) to match property types. -> Option A
  4. Quick Check:

    Constructor params must match generic property types [OK]
Hint: Match constructor param types to generic properties [OK]
Common Mistakes:
  • Using same type for both parameters ignoring generics
  • Removing one generic parameter incorrectly
  • Thinking constructor can't have parameters in generics
5. You want to create a generic class Dictionary<K, V> that stores key-value pairs. Which implementation correctly uses generics to store and retrieve values by key?
class Dictionary<K, V> {
  private items: Map<K, V> = new Map();

  add(key: K, value: V): void {
    this.items.set(key, value);
  }

  get(key: K): V | undefined {
    return this.items.get(key);
  }
}
hard
A. Generic types cannot be used with Map in TypeScript.
B. This implementation correctly uses generics to store and retrieve values by key.
C. The add method should return the value added, not void.
D. The Map should be declared as Map<V, K> to match key-value order.

Solution

  1. Step 1: Analyze Map usage with generics

    The class uses Map<K, V> to store keys of type K and values of type V, which is correct.
  2. Step 2: Check methods for correct generic usage

    The add method sets a key-value pair, and get retrieves the value by key, both using the generic types properly.
  3. Final Answer:

    This implementation correctly uses generics to store and retrieve values by key. -> Option B
  4. Quick Check:

    Generic Map<K, V> with add/get methods = correct [OK]
Hint: Use Map with add/get methods for generic dictionary [OK]
Common Mistakes:
  • Swapping key and value types in Map declaration
  • Expecting add to return a value unnecessarily
  • Believing generics can't be used with built-in 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