Skip to content

Abstract Classes Example

abstract-classes-example/
├── abstracts/
│ └── AbstractRepository.ts
├── entities/
│ └── User.ts
├── implementations/
│ └── UserRepository.ts
├── ioc.config.json
└── container.gen.ts
export abstract class AbstractRepository {
protected abstract tableName: string;
abstract findById(id: string): Promise<any | null>;
abstract save(entity: any): Promise<any>;
abstract delete(id: string): Promise<boolean>;
protected log(message: string): void {
console.log(`[${this.tableName}] ${message}`);
}
}
export interface User {
id: string;
name: string;
email: string;
createdAt: Date;
updatedAt: Date;
}
import { AbstractRepository } from '../abstracts/AbstractRepository';
import { User } from '../entities/User';
export class UserRepository extends AbstractRepository {
protected tableName = 'users';
private users: User[] = [];
async findById(id: string): Promise<User | null> {
this.log(`Finding user by ID: ${id}`);
return this.users.find(user => user.id === id) || null;
}
async findByEmail(email: string): Promise<User | null> {
this.log(`Finding user by email: ${email}`);
return this.users.find(user => user.email === email) || null;
}
async save(user: User): Promise<User> {
this.log(`Saving user: ${user.name}`);
const existingIndex = this.users.findIndex(u => u.id === user.id);
if (existingIndex >= 0) {
this.users[existingIndex] = { ...user, updatedAt: new Date() };
return this.users[existingIndex];
} else {
const newUser = { ...user, createdAt: new Date(), updatedAt: new Date() };
this.users.push(newUser);
return newUser;
}
}
async delete(id: string): Promise<boolean> {
this.log(`Deleting user: ${id}`);
const initialLength = this.users.length;
this.users = this.users.filter(user => user.id !== id);
return this.users.length < initialLength;
}
}
{
"source": ".",
"output": "container.gen.ts",
"exclude": [
"**/*.test.ts",
"**/*.spec.ts"
],
"verbose": true
}
import { UserRepository } from './implementations/UserRepository';
function createCoreModuleContainer() {
let userRepository: UserRepository | undefined;
const getUserRepository = (): UserRepository => {
if (!userRepository) {
userRepository = new UserRepository();
}
return userRepository;
};
return {
get UserRepository(): UserRepository {
return getUserRepository();
}
};
}
const coreModuleContainer = createCoreModuleContainer();
export const container = {
coreModule: coreModuleContainer
};
export type Container = typeof container;
import { container } from './container.gen';
const userRepository = container.coreModule.UserRepository;
// Create a new user
const newUser = await userRepository.save({
id: '1',
name: 'John Doe',
email: 'john@example.com',
createdAt: new Date(),
updatedAt: new Date()
});
// Find user by ID
const user = await userRepository.findById('1');
// Find user by email
const userByEmail = await userRepository.findByEmail('john@example.com');
// Delete user
const deleted = await userRepository.delete('1');