export interface Query { readonly type: string; readonly [key: string]: unknown; } type QueryHandler = (query: T) => R; export class QueryBus { private handlers = new Map(); register(type: string, handler: QueryHandler): void { this.handlers.set(type, handler as QueryHandler); } execute(query: Query): R { const handler = this.handlers.get(query.type); if (!handler) throw new Error(`No handler for query: ${query.type}`); return handler(query) as R; } has(type: string): boolean { return this.handlers.has(type); } }