declare type Primitives = 'boolean' | 'number' | 'object' | 'string' | 'array' | 'undefined' | 'function';
declare type ShiftArr<T> = T extends [_: any, ...rest: infer R] ? R : T extends string ? T : never;
declare type Inner<P> = P extends 'string' ? string : P extends 'number' ? number : P extends 'function' ? AnyFunction : P extends 'array' ? unknown[] : P extends 'boolean' ? boolean : P extends 'undefined' ? undefined : P extends 'bigint' ? bigint : P extends 'object' ? Record<string, unknown> : never;
declare type Unwrap<T> = T extends any[] ? T[0] : T;
declare type PrimitivesTuple = [Primitives, Primitives] | [Primitives, Primitives, Primitives] | [Primitives, Primitives, Primitives, Primitives] | [Primitives, Primitives, Primitives, Primitives, Primitives];
declare type MapPrimitive<P extends any[] | string | any, O = never> = {
    0: MapPrimitive<ShiftArr<P>, O | Inner<Unwrap<P>>>;
    1: O;
    2: Inner<P>;
}[P extends [] ? 1 : P extends string ? 2 : 0];
declare type Assert<S> = S extends [infer U] ? Array<{
    [W in keyof U]: MapPrimitive<U[W]>;
}> : S extends Record<string, Primitives | PrimitivesTuple> ? {
    [W in keyof S]: MapPrimitive<S[W]>;
} : MapPrimitive<[S]>;
declare type Keys<T> = T extends undefined ? Record<string, Primitives | PrimitivesTuple> : T extends Array<any> ? Array<Record<string, Primitives | PrimitivesTuple>> : {
    [K in keyof T]: Primitives | PrimitivesTuple;
};
export declare type PowerPartial<T> = {
    [U in keyof T]?: T[U] extends object ? PowerPartial<T[U]> : T[U];
};
export declare type PowerNonNullable<T> = T extends Array<infer U> ? Array<{
    [K in keyof U]-?: U[K] extends Array<infer Q> ? PowerNonNullable<NonNullable<Q>[]> : PowerNonNullable<NonNullable<U[K]>>;
}> : {
    [K in keyof T]-?: PowerNonNullable<NonNullable<T[K]>>;
};
declare type FilterObject<T> = T extends Array<infer R> ? {
    [K in keyof R]: R[K] extends AnyFunction ? R[K] : R extends Record<string, any> ? PowerPartial<R[K]> : R[K];
} : {
    [K in keyof T]: T[K] extends AnyFunction ? T[K] : T extends Record<string, any> ? PowerPartial<T[K]> : T[K];
};
export declare type isSameType<T, U> = (((a: T) => any) extends (a: U) => any ? true : never) & (((a: U) => any) extends (a: T) => any ? true : never);
export declare type UnionToIntersection<U> = (U extends any ? (_: U) => void : never) extends (_: infer I) => void ? I : never;
export declare type isUnknownOrUndefined<T> = true extends isSameType<T, unknown> ? true : true extends isSameType<T, undefined> ? true : never;
export declare type AnyFunction<T extends any[] = any[], R = any> = (...args: T) => R;
declare type Condition<U, T> = U extends undefined ? Assert<T> : U extends Array<infer R> ? Array<FilterObject<R>> : FilterObject<U>;
export declare function AssertType<U = undefined, T extends Keys<U> | Primitives | Primitives[] | [Record<string, Primitives | Primitives[]>] = Keys<U>>(obj: unknown, typeShape: T, msg?: string): asserts obj is T extends Primitives ? MapPrimitive<[T]> : T extends Array<infer R> ? R extends Primitives ? Assert<R> : Condition<U, T> : Condition<U, T>;
export declare function isType<U = undefined, T extends Keys<U> | Primitives | Primitives[] | [Record<string, Primitives | Primitives[]>] = Keys<U>>(obj: unknown, typeShape: T): obj is T extends Primitives ? MapPrimitive<[T]> : T extends Array<infer R> ? R extends Primitives ? Assert<R> : Condition<U, T> : Condition<U, T>;
export declare function isObject(obj: unknown): obj is Record<string, unknown>;
export declare function AssertObject(obj: unknown, msg?: string): asserts obj is Record<string, unknown>;
export declare function AssertExist<T extends any>(obj: T, msg?: string): asserts obj is NonNullable<T>;
export declare function isExist<T extends any>(obj: T): obj is NonNullable<T>;
declare type TakeLastType<T, U> = U extends undefined ? T : Omit<T, keyof U> & U;
declare type RemoveKey<T, U> = U extends undefined ? T : T & {
    [K in keyof U]: any;
};
export declare function forceCast<T, U = undefined>(obj: any, cb?: AnyFunction<[RemoveKey<T, U>]>): asserts obj is TakeLastType<T, U>;
export {};
