import { Guid, ConcreteType, Type } from '@cashfarm/lang';
import { AggregateRoot, IAggregateRoot, Identity, IDomainEvent } from '../domain';
import { EventEnvelope } from './eventEnvelope';
export interface IESAggregateRoot<TId extends Identity<any> | Guid> extends IAggregateRoot<TId> {
    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<TId extends Identity<any> | Guid> extends AggregateRoot<TId> {
    private _version;
    static load<T extends ESAggregateRoot<any>>(constructor: ConcreteType<T>, events: EventEnvelope[]): T;
    readonly version: number;
    readonly uncommittedChanges: IDomainEvent[];
    markChangesAsCommitted(): void;
    protected applyChange(event: IDomainEvent): void;
}
