What if you could write one function that safely handles any type of data without repeating yourself?
Why generics are needed in Typescript - The Real Reasons
Imagine you want to write a function that works with different types of data, like numbers, strings, or even objects. Without generics, you'd have to write a new function for each type or use a very loose type that doesn't catch mistakes.
Writing separate functions for each data type is slow and repetitive. Using loose types means your program might let errors slip through, causing bugs that are hard to find. This makes your code messy and unreliable.
Generics let you write one flexible function or class that works with any data type, while still keeping type safety. This means your code is cleaner, reusable, and catches errors early.
function identity(value: any) { return value; }function identity<T>(value: T): T { return value; }Generics unlock the power to create reusable, type-safe code that adapts to many data types effortlessly.
Think of a box that can hold anything--whether toys, books, or clothes--without needing a new box for each item. Generics are like that box for your code.
Manual code for each type is slow and error-prone.
Generics let you write one flexible, safe function or class.
This makes your code reusable and easier to maintain.
Practice
function identity<T>(arg: T): T { return arg; }Solution
Step 1: Understand the generic function syntax
The functionidentityuses<T>to accept any type and return the same type.Step 2: Recognize the benefit of generics
This allows the function to work with any type while keeping type safety, preventing errors.Final Answer:
To write functions that work with any data type while keeping type safety -> Option CQuick Check:
Generics = reusable + type safe functions [OK]
- Thinking generics make code faster
- Believing generics force string types
- Confusing generics with avoiding functions
Solution
Step 1: Check generic declaration and usage
function example<T>(arg: T): T { return arg; } correctly declares<T>and usesarg: Twith return typeT.Step 2: Identify syntax errors in other options
function example(arg: T): T { return arg; } misses generic declaration. function example<T>(arg): T { return arg; } misses type forarg. function example<T>(arg: T) { return arg; } misses return type.Final Answer:
function example<T>(arg: T): T { return arg; } -> Option AQuick Check:
Generic syntax requires <T> and typed parameters [OK]
- Omitting <T> after function name
- Not typing function parameters
- Forgetting return type annotation
function wrapInArray<T>(value: T): T[] { return [value]; }
const result = wrapInArray(5);
console.log(result);Solution
Step 1: Understand the generic function behavior
The function takes a value of any type and returns an array containing that value.Step 2: Apply the function to the number 5
CallingwrapInArray(5)returns an array with one element: 5.Final Answer:
[5] -> Option BQuick Check:
wrapInArray(5) = [5] [OK]
- Expecting single value instead of array
- Confusing number 5 with string "5"
- Thinking it causes a type error
function getFirstElement<T>(arr: T) {
return arr[0];
}Solution
Step 1: Analyze parameter type
The parameterarris typed asT, but it should be an array ofTto usearr[0].Step 2: Correct the parameter type
Changearr: Ttoarr: T[]so the function accepts an array.Final Answer:
Parameter should be an array type: arr: T[] -> Option AQuick Check:
Array parameter needs T[] type [OK]
- Using T instead of T[] for arrays
- Changing return type incorrectly
- Trying to use non-array methods on arrays
Solution
Step 1: Check parameter and return types
The function should accept an array of typeT[]and return an object mapping strings to numbers.Step 2: Verify implementation details
function mapToIndex<T>(arr: T[]): { [key: string]: number } { const result: { [key: string]: number } = {}; arr.forEach((item, index) => { result[String(item)] = index; }); return result; } converts each item to string as key and assigns its index as value, correctly building the object.Step 3: Identify errors in other options
function mapToIndex<T>(arr: T): { [key: string]: number } { const result = {}; arr.forEach((item, index) => { result[item] = index; }); return result; } usesarr: Twhich is incorrect for arrays. function mapToIndex(arr: any[]): any { const result = {}; arr.forEach((item, index) => { result[item] = index; }); return result; } usesanylosing type safety. function mapToIndex<T>(arr: T[]): T[] { return arr.map((item, index) => index); } returns an array of indexes, not the mapping object.Final Answer:
function mapToIndex<T>(arr: T[]): { [key: string]: number } { const result: { [key: string]: number } = {}; arr.forEach((item, index) => { result[String(item)] = index; }); return result; } -> Option DQuick Check:
Generic array input + object output with string keys [OK]
- Using T instead of T[] for array parameter
- Returning wrong type (array instead of object)
- Not converting keys to string
Ready to prove it?
Pass the test and this pattern moves unknown
