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;
    split: <T extends Record<string, unknown>, K extends string = "extracted">(t: T, keys: readonly (keyof T)[], prop?: K) => { [P in K]: Partial<T>; };
};
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 takeFirst: <K extends string = string, T = any>(j: Record<K, T>) => [K, T];
export declare const any: <T extends Json = Json>(value: T) => Any<T>;
export {};
