Bird
Raised Fist0
Typescriptprogramming~3 mins

How TypeScript infers generic types - Why You Should Know This

Choose your learning style10 modes available
The Big Idea

What if your code could guess the right types for you, saving time and mistakes?

The Scenario

Imagine you have a function that works with different types of data, like numbers or strings, and you have to write separate versions for each type manually.

For example, one function for numbers, another for strings, and so on.

The Problem

This manual approach is slow and repetitive.

Every time you want to support a new type, you write more code, increasing chances of mistakes and making your program harder to maintain.

The Solution

TypeScript's generic type inference automatically figures out the types you use when calling a function.

This means you write one flexible function, and TypeScript fills in the correct types for you behind the scenes.

Before vs After
✗ Before
function identityNumber(value: number): number { return value; }
function identityString(value: string): string { return value; }
✓ After
function identity<T>(value: T): T { return value; }
const num = identity(123);
const str = identity('hello');
What It Enables

This lets you write reusable, type-safe code that adapts automatically to different data types without extra work.

Real Life Example

Think of a function that returns the first item of any list, whether it's a list of names, numbers, or dates, without rewriting it for each type.

Key Takeaways

Manual type-specific functions are repetitive and error-prone.

TypeScript infers generic types to simplify and secure your code.

You write one function that works for many types automatically.

Practice

(1/5)
1. What does TypeScript do when you call a generic function without specifying the type explicitly?
easy
A. It ignores the generic and treats the function as non-generic.
B. It throws a compilation error asking for the type.
C. It guesses the generic type based on the arguments you pass.
D. It always uses the type any by default.

Solution

  1. Step 1: Understand generic function calls

    When you call a generic function without specifying the type, TypeScript tries to figure out the type from the arguments you provide.
  2. Step 2: Check TypeScript behavior

    TypeScript uses the argument types to infer the generic type automatically, so you don't have to write it explicitly.
  3. Final Answer:

    It guesses the generic type based on the arguments you pass. -> Option C
  4. Quick Check:

    Type inference = guessing type from arguments [OK]
Hint: Remember: TypeScript guesses generic types from arguments [OK]
Common Mistakes:
  • Thinking TypeScript requires explicit generic types always
  • Assuming it defaults to any type
  • Believing generic types are ignored if not specified
2. Which of the following is the correct syntax to define a generic function in TypeScript that returns the same type it receives?
easy
A. function identity<T>(arg: T): T { return arg; }
B. function identity(arg: T): T { return arg; }
C. function identity<T>(arg): T { return arg; }
D. function identity<T>(arg: T): any { return arg; }

Solution

  1. Step 1: Check generic function syntax

    The generic type parameter T must be declared before the function parameters inside angle brackets <T>.
  2. Step 2: Verify parameter and return types

    The parameter arg should be typed as T, and the return type should also be T to return the same type.
  3. Final Answer:

    function identity<T>(arg: T): T { return arg; } -> Option A
  4. Quick Check:

    Generic syntax = <T> before parameters [OK]
Hint: Generic type <T> goes before parameters in function definition [OK]
Common Mistakes:
  • Omitting <T> before parameters
  • Not typing the argument as T
  • Returning any instead of T
3. What will be the output of this TypeScript code?
function wrapInArray<T>(value: T) {
  return [value];
}

const result = wrapInArray(42);
console.log(typeof result[0]);
medium
A. "number"
B. "string"
C. "object"
D. "undefined"

Solution

  1. Step 1: Identify the generic type inferred

    The function wrapInArray is called with 42, a number, so TypeScript infers T as number.
  2. Step 2: Check the returned array and logged type

    The function returns an array containing the number 42. Accessing result[0] gives 42, so typeof result[0] is "number".
  3. Final Answer:

    "number" -> Option A
  4. Quick Check:

    typeof 42 = "number" [OK]
Hint: Generic type matches argument type, so typeof matches argument [OK]
Common Mistakes:
  • Assuming the type is string by default
  • Confusing array type with element type
  • Expecting 'object' because of array
4. Consider this code snippet:
function firstElement<T>(arr: T[]): T {
  return arr[0];
}

const value = firstElement([true, false, true]);
console.log(value.toUpperCase());

What is the problem here?
medium
A. The array passed is empty, so arr[0] is undefined.
B. TypeScript cannot infer the generic type T.
C. The function firstElement returns an array instead of an element.
D. Calling toUpperCase() on a boolean causes a compile-time error.

Solution

  1. Step 1: Analyze the inferred generic type

    The array [true, false, true] is of type boolean[], so T is inferred as boolean.
  2. Step 2: Check the method call on the returned value

    The function returns a boolean, but toUpperCase() is a string method. Calling it on a boolean causes a compile-time error.
  3. Final Answer:

    Calling toUpperCase() on a boolean causes a compile-time error. -> Option D
  4. Quick Check:

    Boolean has no toUpperCase() method [OK]
Hint: Check if method matches the inferred type before calling [OK]
Common Mistakes:
  • Thinking TypeScript inference failed
  • Assuming function returns array instead of element
  • Ignoring compile-time errors from wrong method calls
5. You want to write a generic function mergeObjects that takes two objects and returns a new object combining both. How does TypeScript infer the generic types when you call mergeObjects({name: "Alice"}, {age: 30})?
function mergeObjects(obj1: T, obj2: U): T & U {
  return {...obj1, ...obj2};
}
hard
A. TypeScript infers both T and U as object losing specific properties.
B. TypeScript infers T as {name: string} and U as {age: number}, returning their intersection type.
C. TypeScript cannot infer generic types for multiple parameters automatically.
D. TypeScript infers T and U as any by default.

Solution

  1. Step 1: Identify argument types passed to the function

    The first argument is {name: "Alice"} which has type {name: string}. The second is {age: 30} with type {age: number}.
  2. Step 2: Understand TypeScript's inference for multiple generics

    TypeScript infers T as the type of the first argument and U as the type of the second argument automatically.
  3. Step 3: Check the return type

    The return type is the intersection T & U, meaning the combined object has both name and age properties.
  4. Final Answer:

    TypeScript infers T as {name: string} and U as {age: number}, returning their intersection type. -> Option B
  5. Quick Check:

    Multiple generics inferred from each argument [OK]
Hint: Each generic inferred from corresponding argument type [OK]
Common Mistakes:
  • Assuming generic types default to object or any
  • Thinking TypeScript can't infer multiple generics
  • Confusing intersection type with union type
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