declare type NotSubTypeKeys<T, Condition> = {
    [K in keyof T]: T[K] extends Condition ? never : K;
}[keyof T];
declare type AnyFunction = (...args: any[]) => any;
declare type PropertyKeys<T> = NotSubTypeKeys<T, AnyFunction>;
/** The non-method properties of T. */
export declare type Properties<T> = Pick<T, PropertyKeys<T>>;
/** A base class for data classes so they get the constructor and copy method for free. */
export declare class Imm<T> {
    private readonly immData;
    constructor(data: Properties<T>);
    /** @return a new instance of this class but with the changes in `data` applied. */
    copy(data: Partial<T>): this;
}
/** Annotates a property as immutable/for inclusion in the copy constructor. */
export declare function imm(target: any, propertyKey: string): any;
export {};
