export type HydratableType = 'number' | 'date' | 'bool' | 'string' | 'object' | 'array' | {
    new (...args: any): any;
} | {
    factory: (model: any) => any;
};
interface ModelMapValue {
    type: HydratableType;
    options: HydrateOptions;
}
export type Differences = {
    [key: string]: [unknown, unknown] | Differences;
};
declare global {
    var HydratableModelMap: Map<string, Map<string, ModelMapValue>>;
}
export interface HydrateOptions {
    allowNull?: boolean;
    incomingFieldName?: string;
    arrayElementType?: HydratableType;
    dictionaryValueType?: HydratableType;
}
export declare function hy(type: HydratableType, options?: HydrateOptions): (target: any, propertyKey: string) => void;
export declare class Hydratable<T> {
    constructor(data: T);
    toJSON(): T;
    diff(other: Hydratable<T>, skip?: {
        [field: string]: true;
    }): Differences;
    private areDatesEqual;
    private diffArrays;
    private diffObject;
    private hydrate;
    private setField;
    private setNumber;
    private setDate;
    private setBool;
    private setString;
    private setArray;
    private setObject;
    private copyBuffer;
    private copyArray;
    private copyObject;
    private forEachHyProp;
    private isObject;
    private isArray;
    private isDate;
    private setOnThis;
}
export {};
