import { Get } from './Get';
import { TypeGuard } from './TypeGuard';
export type JsonValue = string | number | boolean | null | Json | JsonValue[];
export type Json = {
    [key: string]: JsonValue;
};
export declare const isJson: TypeGuard<{
    toJSON: () => Json;
}>;
export declare const json: {
    parse: <T extends Json = Json>(subject: unknown) => T;
    merge: (...subjects: unknown[]) => Json;
    delete: <T extends Json = Json>(subject: T, key: string) => T;
    set: <T extends Json = Json>(subject: T, key?: string, value?: unknown) => T;
    omit: <T extends Json = Json>(subject: T, ...keys: string[]) => T;
    pick: <T extends Json = Json>(subject: T, ...keys: string[]) => T;
    defaults: <T extends Json = Json>(options?: Partial<T>, defaults?: Partial<T>) => T;
    isSubset: (subject: Json, subset: Json) => boolean;
};
export declare const toJson: (...subjects: unknown[]) => Json;
export declare const asJson: (j?: unknown, alt?: Get<Json>) => Json;
declare class Any<T extends Json> {
    readonly value: T;
    constructor(value: T);
    merge: (...subjects: T[]) => Any<T>;
    delete: (key: keyof T) => Any<T>;
    omit: (...keys: (keyof T)[]) => Any<T>;
    set: (key: keyof T, value?: unknown) => Any<T>;
    toJSON(): Json;
}
export declare const takeFirstKey: (j: unknown, alt?: string) => string;
export declare const any: <T extends Json = Json>(value: T) => Any<T>;
export {};
