export type Filter<T> = {
    $and: Array<Filter<T>>;
} | {
    $or: Array<Filter<T>>;
} | {
    $not: Filter<T>;
} | Conditions<T>;
type Conditions<T> = {
    [K in keyof T]?: T[K] extends Array<infer E> ? ArrayOperator<E> : ScalarOperator<T[K]>;
};
export type ScalarOperator<T> = EqOperator<T> | NeqOperator<T> | InOperator<T> | GtOperator<T> | GteOperator<T> | LtOperator<T> | LteOperator<T> | T;
export type ArrayOperator<T> = ContainsOperator<T>;
export type AutocompleteOperator<T> = {
    $autocomplete: T;
};
export type EqOperator<T> = {
    $eq: T;
};
export type GtOperator<T> = {
    $gt: T;
};
export type GteOperator<T> = {
    $gte: T;
};
export type LtOperator<T> = {
    $lt: T;
};
export type LteOperator<T> = {
    $lte: T;
};
export type NeqOperator<T> = {
    $neq: T;
};
export type InOperator<T> = {
    $in: Array<T>;
};
export type ContainsOperator<T> = {
    $contains: T;
};
export declare function applyFilter<T>(obj: T, filter: Filter<T>): boolean;
export {};
