import { Guid, ConcreteType, Type } from '@cashfarm/lang'; import { AggregateRoot, IAggregateRoot, Identity, IDomainEvent } from '../domain'; import { EventEnvelope } from './eventEnvelope'; export interface IESAggregateRoot | Guid> extends IAggregateRoot { readonly version: number; readonly uncommittedChanges: IDomainEvent[]; markChangesAsCommitted(): void; } /** * Returns a symbol used to created methods that apply events to agrregates * * @export * @param {(DomainEvent & Type)} e * @returns {symbol} */ export declare function Apply(e: IDomainEvent & Type): symbol; /** * Base implementation for an event sourced aggregate root. * * Extend this class and implement `[Apply(EvtClass)]()` methods for * each event of your aggregate. */ export declare class ESAggregateRoot | Guid> extends AggregateRoot { private _version; static load>(constructor: ConcreteType, events: EventEnvelope[]): T; readonly version: number; readonly uncommittedChanges: IDomainEvent[]; markChangesAsCommitted(): void; protected applyChange(event: IDomainEvent): void; }