TypeScript Generics Deep Dive
Generics let you write code that works with multiple types while preserving full type safety.
Basic generics
function identity<T>(value: T): T {
return value;
}
const num = identity(42); // T inferred as number
const str = identity("hello"); // T inferred as string
Generic constraints
function getLength<T extends { length: number }>(value: T): number {
return value.length;
}
getLength("hello"); // ✅ string has .length
getLength([1, 2, 3]); // ✅ array has .length
getLength(42); // ❌ Error: number has no .length
Multiple type parameters
function merge<T extends object, U extends object>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 };
}
Generic interfaces
interface Repository<T> {
findById(id: string): Promise<T | null>;
save(entity: T): Promise<T>;
delete(id: string): Promise<void>;
}
class UserRepository implements Repository<User> {
// ...
}