Generic repository pattern in Typescript - Mini Project: Build & Apply
Book interfaceBook with two string properties: title and author.Use the interface keyword to define the shape of a book object.
Repository classRepository with a type parameter T. Inside, create a private array called items to store objects of type T. Initialize it as an empty array.Use class Repository<T> and declare private items: T[] = []; inside it.
add and getAll methods to RepositoryRepository class, add a method called add that takes a parameter item of type T and adds it to the items array. Also add a method called getAll that returns the array of items.Define add(item: T): void to push item into items. Define getAll(): T[] to return items.
Repository with Book and print all booksbookRepo as a new Repository<Book>. Add two books to bookRepo using the add method with these exact values: { title: "1984", author: "George Orwell" } and { title: "The Hobbit", author: "J.R.R. Tolkien" }. Then print the result of bookRepo.getAll() using console.log.Create bookRepo as new Repository<Book>(). Use add twice with the exact book objects. Print with console.log(bookRepo.getAll()).
Practice
What is the main benefit of using the Generic Repository Pattern in TypeScript?
Solution
Step 1: Understand the purpose of the generic repository
The generic repository pattern is designed to handle data operations for many types using one class or interface.Step 2: Compare options with the pattern's purpose
Only It allows handling multiple data types with one reusable class. correctly describes this benefit. Options A, B, and C are unrelated to the pattern's main use.Final Answer:
It allows handling multiple data types with one reusable class. -> Option AQuick Check:
Generic repository = reusable data handler [OK]
- Thinking it generates UI components
- Confusing it with TypeScript compilation
- Believing it removes interfaces
Which of the following is the correct way to declare a generic repository interface in TypeScript?
interface IRepository<T> {
add(item: T): void;
get(id: number): T | undefined;
}Solution
Step 1: Check generic syntax correctness
interface IRepository<T> { add(item: T): void; get(id: number): T | undefined; } correctly declares a generic interface with type parameter <T> and uses it consistently in method signatures.Step 2: Validate method signatures
interface IRepository<T> { add(item: T): void; get(id: number): T | undefined; }'s methods useitem: Tand returnT | undefinedfor get, which is correct. Other options misuse types or parameter types.Final Answer:
interface IRepository<T> { add(item: T): void; get(id: number): T | undefined; } -> Option AQuick Check:
Generic interface syntax = interface IRepository<T> { add(item: T): void; get(id: number): T | undefined; } [OK]
- Using 'any' instead of generic type T
- Mismatching parameter and return types
- Using wrong id parameter type
Given the following generic repository class, what will be the output of the console.log statement?
class Repository<T> {
private items: T[] = [];
add(item: T): void {
this.items.push(item);
}
getAll(): T[] {
return this.items;
}
}
const repo = new Repository<string>();
repo.add('apple');
repo.add('banana');
console.log(repo.getAll());Solution
Step 1: Understand the generic repository usage
The repository is created for strings, so it stores string items in an array.Step 2: Trace the add and getAll methods
Two strings 'apple' and 'banana' are added, so getAll returns ['apple', 'banana'].Final Answer:
['apple', 'banana'] -> Option DQuick Check:
Added items = ['apple', 'banana'] [OK]
- Expecting only one item in output
- Thinking getAll returns empty array
- Confusing type errors
Identify the error in this generic repository implementation:
class Repository<T> {
private items: T[] = [];
add(item: T): void {
this.items.push(item);
}
get(id: number): T {
return this.items[id];
}
}
const repo = new Repository<number>();
console.log(repo.get(0));Solution
Step 1: Analyze the get method return type
The get method returnsthis.items[id], which may be undefined if the index is invalid.Step 2: Check return type compatibility
Sinceundefinedis possible, the return type should beT | undefinedto avoid runtime errors.Final Answer:
The get method should return T | undefined to handle missing items. -> Option CQuick Check:
Return type must allow undefined for missing index [OK]
- Ignoring possible undefined return
- Changing add method unnecessarily
- Making items public without reason
You want to create a generic repository that supports updating an item by id. Which method signature correctly fits this requirement?
Solution
Step 1: Understand update method needs
To update an item, you need to specify which item by id and provide the new item data.Step 2: Evaluate method signatures
update(id: number, item: T): boolean takes an id and a new item of type T, returning boolean to indicate success, which fits the requirement best.Final Answer:
update(id: number, item: T): boolean -> Option BQuick Check:
Update needs id and new item, returns success [OK]
- Missing id parameter
- Using wrong parameter types
- Returning wrong type from update
Ready to prove it?
Pass the test and this pattern moves unknown
