export interface Boxed { __boxed: ''; value: T; } export interface UnboxedArray extends Array { [idx: number]: Unboxed; } export declare type UnboxedObject = { [prop in keyof T]: Unboxed; }; export declare type Unboxed = T extends Boxed ? any : T extends Boxed ? any : T extends Boxed ? undefined : T extends Boxed ? null : T extends Boxed ? string : T extends Boxed ? string | undefined : T extends Boxed ? string | null : T extends Boxed ? string | undefined | null : T extends Boxed ? number : T extends Boxed ? number | undefined : T extends Boxed ? number | null : T extends Boxed ? number | undefined | null : T extends Boxed ? boolean : T extends Boxed ? boolean | undefined : T extends Boxed ? boolean | null : T extends Boxed ? boolean | undefined | null : T extends Boxed<(infer U)[]> ? U[] : T extends Boxed<(infer U)[] | undefined> ? U[] | undefined : T extends Boxed<(infer U)[] | null> ? U[] | null : T extends Boxed<(infer U)[] | undefined | null> ? U[] | undefined | null : T extends Boxed ? U : T extends Boxed ? U | undefined : T extends Boxed ? U | null : T extends Boxed ? U | undefined | null : T extends symbol[] ? any : T extends symbol ? any : T extends undefined ? undefined : T extends null ? null : T extends string ? string : T extends number ? number : T extends boolean ? boolean : T extends (infer U)[] ? UnboxedArray : UnboxedObject; export declare function isBoxed(value: any): value is Boxed; export declare function box(value: T): Boxed; export declare function unbox(value: T): Unboxed;