Bird
Raised Fist0
Typescriptprogramming~5 mins

Recursive generic types in Typescript - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a recursive generic type in TypeScript?
A recursive generic type is a type that refers to itself within its own definition, allowing you to model nested or hierarchical data structures like trees or linked lists.
Click to reveal answer
beginner
How does a recursive generic type help in representing tree-like data?
It allows each node to have children of the same type, enabling the structure to nest indefinitely, like branches in a tree.
Click to reveal answer
intermediate
Example: What does this TypeScript type represent?
type NestedArray<T> = T | NestedArray<T>[];
It represents a value that can be either a single item of type T or an array of NestedArray<T>, allowing for deeply nested arrays of T.
Click to reveal answer
intermediate
Why must recursive generic types be carefully designed?
Because if not designed properly, they can cause infinite recursion in type checking or make code hard to understand and maintain.
Click to reveal answer
beginner
How do recursive generic types relate to real-life examples?
They are like Russian nesting dolls or family trees, where each item contains smaller items of the same kind inside it.
Click to reveal answer
What does a recursive generic type allow you to do in TypeScript?
ADefine types that refer to themselves
BCreate functions that call themselves
CUse generics without specifying type parameters
DAvoid using generics altogether
Which of these is an example of a recursive generic type?
Atype Number = number
Btype StringArray = string[]
Ctype Tree<T> = { value: T; children: Tree<T>[] }
Dtype Pair<T> = [T, T]
What problem can arise if recursive generic types are not designed carefully?
AInfinite recursion in type checking
BSyntax errors in JavaScript runtime
CMemory leaks in the browser
DFaster code execution
In the type type Nested<T> = T | Nested<T>[];, what does this type represent?
AA function returning type T
BOnly arrays of type T
COnly single values of type T
DA value of type T or an array of nested values
Which real-life example best illustrates recursive generic types?
AA single book on a shelf
BA family tree with parents and children
CA flat list of names
DA calculator performing addition
Explain what recursive generic types are and give a simple example.
Think about types that include themselves inside their definition.
You got /3 concepts.
    Describe a real-world situation where recursive generic types would be helpful and why.
    Consider things like trees, folders, or nested lists.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using recursive generic types in TypeScript?
      easy
      A. To create simple flat types without any nesting
      B. To automatically generate UI components
      C. To enforce runtime type checking
      D. To define types that refer to themselves for nested or hierarchical data

      Solution

      1. Step 1: Understand recursive generic types

        Recursive generic types allow a type to refer to itself, which helps model nested or hierarchical data structures like trees or linked lists.
      2. Step 2: Compare options

        Options A, C, and D do not describe recursive generics correctly. Only To define types that refer to themselves for nested or hierarchical data correctly states their purpose.
      3. Final Answer:

        To define types that refer to themselves for nested or hierarchical data -> Option D
      4. Quick Check:

        Recursive generics = self-referential types [OK]
      Hint: Recursive generics model nested data by referring to themselves [OK]
      Common Mistakes:
      • Thinking recursive generics are for runtime checks
      • Confusing recursive generics with simple generics
      • Assuming recursive generics flatten data
      2. Which of the following is the correct syntax to define a recursive generic type for a nested object with children of the same type?
      easy
      A. type Node<T> = { value: T; children: Node[] };
      B. type Node<T> = { value: T; children?: Node<T>[] };
      C. type Node<T> = { value: T; children: Node<T> };
      D. type Node<T> = { value: T; children: T[] };

      Solution

      1. Step 1: Analyze recursive generic syntax

        The type should refer to itself with the generic parameter and allow children to be an array of the same type or optional to avoid infinite recursion.
      2. Step 2: Check each option

        type Node<T> = { value: T; children?: Node<T>[] }; correctly defines children as optional array of Node<T>. type Node<T> = { value: T; children: Node[] }; misses generic parameter. type Node<T> = { value: T; children: Node<T> }; makes children a single Node, not array. type Node<T> = { value: T; children: T[] }; uses T[] which is incorrect.
      3. Final Answer:

        type Node<T> = { value: T; children?: Node<T>[] }; -> Option B
      4. Quick Check:

        Recursive generic with optional children array = type Node<T> = { value: T; children?: Node<T>[] }; [OK]
      Hint: Use optional array of same generic type for recursive children [OK]
      Common Mistakes:
      • Omitting generic parameter in recursive reference
      • Making children non-array when it should be array
      • Not making children optional causing infinite recursion
      3. Given the following TypeScript code, what is the type of tree.children[0].children[0].value?
      type TreeNode<T> = { value: T; children?: TreeNode<T>[] };
      const tree: TreeNode<string> = {
        value: "root",
        children: [
          { value: "child1", children: [{ value: "grandchild1" }] },
          { value: "child2" }
        ]
      };
      medium
      A. string
      B. TreeNode<string>
      C. string | undefined
      D. TreeNode<string> | undefined

      Solution

      1. Step 1: Understand the type definition

        TreeNode<T> has a value of type T. Here, T is string.
      2. Step 2: Trace the property access

        tree.children[0].children[0].value accesses the value of a nested node, which is a string as per the generic type.
      3. Final Answer:

        string -> Option A
      4. Quick Check:

        Nested node value type = string [OK]
      Hint: Generic type T defines value type at all levels [OK]
      Common Mistakes:
      • Confusing node type with value type
      • Assuming children or value can be undefined here
      • Mixing up generic parameter with node type
      4. Identify the error in this recursive generic type definition:
      type ListNode<T> = {
        value: T;
        next: ListNode<T>;
      };
      medium
      A. 'value' should be optional
      B. Generic parameter T is not used correctly
      C. Missing optional property for 'next' causing infinite recursion
      D. TypeScript does not support recursive types

      Solution

      1. Step 1: Analyze the recursive type definition

        The next property refers to ListNode<T> without being optional, so it requires an infinite chain.
      2. Step 2: Identify the fix

        Making next optional (next?: ListNode<T>) provides a base case to stop recursion.
      3. Final Answer:

        Missing optional property for 'next' causing infinite recursion -> Option C
      4. Quick Check:

        Recursive types need optional base case [OK]
      Hint: Make recursive property optional to avoid infinite recursion [OK]
      Common Mistakes:
      • Forgetting to add '?' to recursive property
      • Thinking TypeScript disallows recursive types
      • Making unrelated properties optional
      5. You want to create a recursive generic type NestedArray<T> that represents an array of elements of type T or arrays of NestedArray<T> (nested arrays). Which of the following definitions correctly models this?
      hard
      A. type NestedArray<T> = Array;
      B. type NestedArray<T> = T | NestedArray<T>[];
      C. type NestedArray<T> = Array<T> | NestedArray<T>;
      D. type NestedArray<T> = T[] | NestedArray<T>;

      Solution

      1. Step 1: Understand the nested array structure

        A nested array can be an array of elements of type T or arrays of nested arrays recursively.
      2. Step 2: Evaluate each option

        type NestedArray<T> = Array; correctly defines NestedArray<T> as an array whose elements are either T or NestedArray<T>. type NestedArray<T> = T | NestedArray<T>[]; is incorrect because it allows a single element T without array wrapper. Options C and D misuse union and array placement.
      3. Final Answer:

        type NestedArray<T> = Array<T | NestedArray<T>>; -> Option A
      4. Quick Check:

        Nested arrays = arrays of T or nested arrays [OK]
      Hint: Use array of union of T or NestedArray<T> for nested arrays [OK]
      Common Mistakes:
      • Allowing T alone without array wrapper
      • Incorrect union placement outside array
      • Confusing recursive generic with simple union
      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