Abstract Classes Example
Project Structure
Section titled “Project Structure”abstract-classes-example/├── abstracts/│ └── AbstractRepository.ts├── entities/│ └── User.ts├── implementations/│ └── UserRepository.ts├── ioc.config.json└── container.gen.ts
Abstract Base Class
Section titled “Abstract Base Class”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}`); }}
Entity Definition
Section titled “Entity Definition”export interface User { id: string; name: string; email: string; createdAt: Date; updatedAt: Date;}
Concrete Implementation
Section titled “Concrete Implementation”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; }}
Configuration
Section titled “Configuration”{ "source": ".", "output": "container.gen.ts", "exclude": [ "**/*.test.ts", "**/*.spec.ts" ], "verbose": true}
Generated Container
Section titled “Generated Container”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 userconst newUser = await userRepository.save({ id: '1', name: 'John Doe', email: 'john@example.com', createdAt: new Date(), updatedAt: new Date()});
// Find user by IDconst user = await userRepository.findById('1');
// Find user by emailconst userByEmail = await userRepository.findByEmail('john@example.com');
// Delete userconst deleted = await userRepository.delete('1');