Bird
Raised Fist0
Typescriptprogramming~3 mins

Why Generic arrow functions in Typescript? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if one simple function could work perfectly with any kind of data you throw at it?

The Scenario

Imagine you need to write many small functions that do similar things but work with different types of data, like numbers, strings, or objects. Writing each function separately means a lot of repeated code.

The Problem

Writing separate functions for each data type is slow and boring. It's easy to make mistakes when copying and changing code. Also, if you want to change the logic, you must update many places, which wastes time and causes bugs.

The Solution

Generic arrow functions let you write one flexible function that works with any data type. You write the logic once, and TypeScript helps you keep it safe and correct for all types. This saves time and reduces errors.

Before vs After
✗ Before
function identityNumber(x: number): number { return x; }
function identityString(x: string): string { return x; }
✓ After
const identity = <T>(x: T): T => x;
What It Enables

It enables writing reusable, type-safe functions that adapt to any data type effortlessly.

Real Life Example

Think of a function that returns the first item of any list, whether it's a list of names, ages, or products. Generic arrow functions let you write this once and use it everywhere.

Key Takeaways

Writing separate functions for each type is repetitive and error-prone.

Generic arrow functions let you write one flexible function for all types.

This saves time, reduces bugs, and keeps your code clean and safe.

Practice

(1/5)
1.

What does the <T> represent in a generic arrow function in TypeScript?

easy
A. A variable name for a function parameter
B. A placeholder for a type that will be specified later
C. A keyword to declare a constant
D. A special operator for comparison

Solution

  1. Step 1: Understand generic type parameters

    The <T> syntax declares a generic type parameter, which acts as a placeholder for any type.
  2. Step 2: Recognize its purpose in functions

    This allows the function to work with different types while keeping type safety.
  3. Final Answer:

    A placeholder for a type that will be specified later -> Option B
  4. Quick Check:

    Generic type parameter = placeholder type [OK]
Hint: Think of <T> as a flexible type placeholder [OK]
Common Mistakes:
  • Confusing <T> with a variable name
  • Thinking <T> is a keyword like const or let
  • Assuming <T> is an operator
2.

Which of the following is the correct syntax for a generic arrow function that returns the same type it receives?

?
easy
A. const identity = <T> = (arg: T): T => arg;
B. const identity = <T>: (arg: T) => T => arg;
C. const identity = <T>(arg: T): T => arg;
D. const identity = <T> (arg: T) => { return arg; };

Solution

  1. Step 1: Check generic arrow function syntax

    The generic type parameter <T> must come immediately after the function name without an equals sign.
  2. Step 2: Verify arrow function structure

    The function takes an argument of type T and returns the same type T. const identity = <T>(arg: T): T => arg; matches this syntax correctly.
  3. Final Answer:

    const identity = <T>(arg: T): T => arg; -> Option C
  4. Quick Check:

    Correct generic arrow function syntax = const identity = <T>(arg: T): T => arg; [OK]
Hint: Generic syntax: const fn = <T>(arg: T): T => ... [OK]
Common Mistakes:
  • Adding an equals sign after <T>
  • Misplacing parentheses around <T>
  • Using incorrect arrow function syntax
3.

What will be the output of this TypeScript code?

const wrapInArray = <T>(value: T): T[] => [value];

console.log(wrapInArray(5));
console.log(wrapInArray('hello'));
medium
A. [5] ['hello']
B. 5 hello
C. [5, 'hello']
D. Error: Type mismatch

Solution

  1. Step 1: Understand the generic function behavior

    The function wrapInArray takes a value of any type T and returns an array containing that value.
  2. Step 2: Analyze the console.log outputs

    Calling wrapInArray(5) returns [5], and wrapInArray('hello') returns ['hello'].
  3. Final Answer:

    [5] ['hello'] -> Option A
  4. Quick Check:

    Generic function returns array with input value [OK]
Hint: Generic function wraps input in array, output matches input type [OK]
Common Mistakes:
  • Expecting output without array brackets
  • Thinking it returns a tuple
  • Confusing types causing errors
4.

Identify the error in this generic arrow function and choose the corrected version:

const getFirst = <T> = (arr: T[]): T => {
  return arr[0];
};
medium
A. const getFirst = <T> (arr: T[]): T => { return arr[0]; };
B. const getFirst = (arr: T[]): T => arr[0];
C. const getFirst = <T>: (arr: T[]) => T => arr[0];
D. const getFirst = <T>(arr: T[]): T => arr[0];

Solution

  1. Step 1: Identify incorrect syntax in original code

    The original code incorrectly uses an equals sign after <T>, which is not valid syntax for generic arrow functions.
  2. Step 2: Choose the correct syntax

    const getFirst = <T>(arr: T[]): T => arr[0]; correctly places <T> immediately after the function name without an equals sign and uses concise arrow function syntax.
  3. Final Answer:

    const getFirst = <T>(arr: T[]): T => arr[0]; -> Option D
  4. Quick Check:

    Generic arrow function syntax = const getFirst = <T>(arr: T[]): T => arr[0]; [OK]
Hint: No equals sign after <T> in generic arrow functions [OK]
Common Mistakes:
  • Adding equals sign after <T>
  • Omitting generic parameter <T>
  • Incorrect arrow function syntax
5.

Given this generic arrow function, what is the output of mergeObjects({a: 1}, {b: 2})?

const mergeObjects = <T, U>(obj1: T, obj2: U): T & U => ({ ...obj1, ...obj2 });

console.log(mergeObjects({a: 1}, {b: 2}));
hard
A. { a: 1, b: 2 }
B. { a: 1 }
C. { b: 2 }
D. TypeError at runtime

Solution

  1. Step 1: Understand the generic parameters and return type

    The function takes two objects of types T and U and returns their intersection type T & U, meaning it combines properties from both.
  2. Step 2: Analyze the spread operator usage

    The spread operator merges properties from both objects into a new object containing all keys and values.
  3. Step 3: Predict the output of the console.log

    Calling mergeObjects({a: 1}, {b: 2}) returns { a: 1, b: 2 }.
  4. Final Answer:

    { a: 1, b: 2 } -> Option A
  5. Quick Check:

    Spread merge of two objects = combined object [OK]
Hint: Spread operator merges objects, output has all keys [OK]
Common Mistakes:
  • Expecting only first or second object properties
  • Confusing intersection type with union
  • Thinking it causes runtime error
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