Abstract Classes
Step 1: Write Your Code
Section titled “Step 1: Write Your Code”export abstract class AbstractUserRepository { abstract findById(id: string): Promise<User | null>; protected log(message: string): void { console.log(`[UserRepo] ${message}`); }}
// implementations/UserRepository.tsexport class UserRepository extends AbstractUserRepository { async findById(id: string): Promise<User | null> { this.log(`Finding user ${id}`); // ... implementation }}
// use-cases/ProductUseCase.tsexport class ProductUseCase { constructor( private productRepo: AbstractProductRepository, private userRepo: AbstractUserRepository // Cross-module! ) {}}Step 2: Generate Container
Section titled “Step 2: Generate Container”npx @notjustcoders/ioc-arise generateStep 3: Generated Code
Section titled “Step 3: Generated Code”container.gen.d.ts:
export interface ContainerRegistry { 'AbstractUserRepository': UserRepository; 'AbstractProductRepository': ProductRepository; 'ProductUseCase': ProductUseCase;}container.gen.ts:
import { Container, Lifecycle } from '@notjustcoders/di-container';import type { ContainerRegistry } from './container.gen.d';import { UserRepository } from './implementations/UserRepository';import { ProductRepository } from './implementations/ProductRepository';import { ProductUseCase } from './use-cases/ProductUseCase';
export const container = new Container<ContainerRegistry>();
// Abstract class registered with concrete implementationcontainer.register('AbstractUserRepository', { useClass: UserRepository, lifecycle: Lifecycle.Singleton});
container.register('AbstractProductRepository', { useClass: ProductRepository, lifecycle: Lifecycle.Singleton});
container.register('ProductUseCase', { useClass: ProductUseCase, dependencies: ['AbstractProductRepository', 'AbstractUserRepository'], lifecycle: Lifecycle.Singleton});Step 4: Use It
Section titled “Step 4: Use It”import { container } from './container.gen';
// Resolve by abstract class nameconst userRepo = container.resolve('AbstractUserRepository');// ^? UserRepository - Full type safety!const productUseCase = container.resolve('ProductUseCase');