📖 Scenario: You are building a simple utility library in TypeScript that can work with different types of data.
🎯 Goal: Create a generic function that returns the first element of any array, no matter what type of elements it holds.
📋 What You'll Learn
Create a generic function called getFirstElement
The function should accept one parameter called arr which is an array of generic type T
The function should return the first element of the array with type T
Call the function with a number array and a string array
Print the results of both calls
💡 Why This Matters
🌍 Real World
Generic functions are useful in libraries and frameworks where you want to write code that works with many data types without repeating yourself.
💼 Career
Understanding generics is important for TypeScript developers to write flexible and safe code, which is highly valued in professional software development.
Progress0 / 4 steps
1
Create a number array
Create a variable called numbers and assign it the array [10, 20, 30].
Typescript
Hint
Use const numbers = [10, 20, 30]; to create the array.
2
Create a string array
Create a variable called words and assign it the array ["apple", "banana", "cherry"].
Typescript
Hint
Use const words = ["apple", "banana", "cherry"]; to create the array.
3
Create the generic function
Create a generic function called getFirstElement with a type parameter T. It should take one parameter arr of type T[] and return the first element of arr with type T.
Typescript
Hint
Use function getFirstElement<T>(arr: T[]): T { return arr[0]; }.
4
Call the function and print results
Call getFirstElement with numbers and assign the result to firstNumber. Call getFirstElement with words and assign the result to firstWord. Then print firstNumber and firstWord using console.log.
Typescript
Hint
Use const firstNumber = getFirstElement(numbers); and console.log(firstNumber); similarly for words.
Practice
(1/5)
1. What does the <T> represent in a TypeScript generic function?
easy
A. A placeholder for a type that will be specified later
B. A variable name for a function parameter
C. A special keyword to declare a constant
D. A syntax error in TypeScript
Solution
Step 1: Understand generic syntax
The <T> syntax is used to declare a generic type parameter in TypeScript functions.
Step 2: Identify the role of T
It acts as a placeholder for any type that will be provided when the function is called, making the function reusable for different types.
Final Answer:
A placeholder for a type that will be specified later -> Option A
Quick Check:
Generic <T> = Type placeholder [OK]
Hint: Remember <T> means 'type to be decided' [OK]
Common Mistakes:
Thinking T is a variable name
Confusing <T> with a function argument
Assuming <T> is a TypeScript keyword
2. Which of the following is the correct syntax to declare a generic function named identity that returns the same type it receives?
easy
A. function identity<T>(arg): T { return arg; }
B. function identity(arg: T): T { return arg; }
C. function identity<T>(arg: T): T { return arg; }
D. function identity<T>(arg: T): void { return arg; }
Solution
Step 1: Check generic declaration
The generic type <T> must be declared before the function parameters.
Step 2: Verify parameter and return types
The parameter arg should be of type T, and the function should return the same type T.
Final Answer:
function identity<T>(arg: T): T { return arg; } -> Option C
Quick Check:
Generic function syntax = function identity<T>(arg: T): T { return arg; } [OK]
Hint: Generic type <T> goes before parameters [OK]
Common Mistakes:
Omitting <T> before parameters
Not specifying type for arg
Using void as return type incorrectly
3. What will be the output of the following TypeScript code?
function wrapInArray<T>(value: T): T[] { return [value]; } const result = wrapInArray(5); console.log(result);
medium
A. TypeError at runtime
B. 5
C. SyntaxError
D. [5]
Solution
Step 1: Understand function behavior
The function wrapInArray takes a value of any type T and returns an array containing that value.
Step 2: Analyze the call with number 5
Calling wrapInArray(5) returns an array with one element: [5].
Final Answer:
[5] -> Option D
Quick Check:
wrapInArray(5) = [5] [OK]
Hint: Generic returns array with input inside brackets [OK]
Common Mistakes:
Expecting just the value without array
Confusing output with error
Misreading return type as void
4. Identify the error in this generic function declaration:
function getFirstElement<T>(arr: T): T { return arr[0]; }
medium
A. Parameter arr should be an array type T[], not T
B. Return type should be T[] instead of T
C. Generic type <T> is missing
D. Function should not use generics here
Solution
Step 1: Check parameter type
The parameter arr is declared as type T, but the function tries to access arr[0], which requires arr to be an array.
Step 2: Correct parameter type
To access the first element, arr should be of type T[] (array of T), not just T.
Final Answer:
Parameter arr should be an array type T[], not T -> Option A
Quick Check:
Array parameter needs T[] type [OK]
Hint: Array parameters need T[] type, not just T [OK]
Common Mistakes:
Using T instead of T[] for arrays
Returning wrong type
Forgetting to declare generic <T>
5. You want to write a generic function mergeObjects that takes two objects of possibly different types and returns a new object combining both. Which is the correct syntax to declare this function?
hard
A. function mergeObjects(obj1: T, obj2: U): object { return {...obj1, ...obj2}; }
B. function mergeObjects(obj1: T, obj2: U): T & U { return {...obj1, ...obj2}; }
C. function mergeObjects(obj1: object, obj2: object): object { return {...obj1, ...obj2}; }
D. function mergeObjects<T>(obj1: T, obj2: T): T { return {...obj1, ...obj2}; }
Solution
Step 1: Understand the requirement
The function should accept two objects of different types and return a combined object containing properties of both.
Step 2: Check generic parameters and return type
Using two generic types T and U allows different input types. The return type T & U means an object with properties from both types.
Step 3: Verify function body
The spread operator {...obj1, ...obj2} correctly merges the two objects.
Final Answer:
function mergeObjects<T, U>(obj1: T, obj2: U): T & U { return {...obj1, ...obj2}; } -> Option B
Quick Check:
Two generics + intersection return = function mergeObjects(obj1: T, obj2: U): T & U { return {...obj1, ...obj2}; } [OK]
Hint: Use two generics and return type intersection T & U [OK]
Common Mistakes:
Using same generic type for both parameters
Returning just object loses type info
Not using intersection type for return
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.