interface PropertyMetadata<Serialized = any, Deserialized = Serialized> {
    key: string;
    serializedKey: string;
    serializer?: (deserialized: Deserialized) => Serialized;
    deserializer?: (serialized: Serialized) => Deserialized;
}
declare type PropertyOptions = string | Omit<Partial<PropertyMetadata>, "key">;
export declare function Property(_opts?: PropertyOptions): (target: any, propertyKey: string) => void;
export declare class Bargain<T extends Function[]> {
    definitions: T;
    constructor(definitions: T);
    /**
     * Turns an instance of a class into a prototype-less object (no longer an instance of the class).
     * @param instance
     * @returns
     */
    serialize<F extends T[number]["prototype"]>(instance: F): Record<string, unknown>;
    /**
     * Turns the serialized data into an instance of a class.
     * @param serialized
     */
    deserialize<F extends T[number]>(serialized: unknown, classDef: F): F["prototype"];
}
export {};
