import './object';
export declare enum PropertyAccess {
    CanRead = 0,
    CanWrite = 1
}
declare global {
    namespace Reflect {
        interface IEndOfPathAction {
            value: unknown;
            shouldContinue: boolean;
        }
        interface ITypeOf<T = object> {
            type: string;
            isArray: boolean;
            isObject: boolean;
            isPrototype: boolean;
            isInstance: boolean;
            isNull: boolean;
            isUndefined: boolean;
            isNullOrUndefined: boolean;
            isBoolean: boolean;
            isNumber: boolean;
            isString: boolean;
            isPrimitive: boolean;
            isFunction: boolean;
            isDate: boolean;
            value: T;
        }
        function isOrDerivesFrom(source: unknown, derivesFrom: unknown): boolean;
        function className(instance: unknown): string;
        function getDefinition(target: unknown, memberKey: PropertyKey): PropertyDescriptor;
        function getAllDefinitionsForMember(target: unknown, memberName: string): PropertyDescriptor[];
        function getAllDefinitions(target: unknown): PropertyDescriptorMap;
        function getProperty<T>(target: unknown, propertyName: string): T;
        function getProperty<T>(target: unknown, propertyName: string, defaultValue: T): T;
        function getProperty<T>(target: unknown, propertyName: string, defaultValue: T, addIfNotExists: boolean): T;
        function setProperty<T>(target: unknown, propertyName: string, value: T): void;
        function checkPropertyAccess(target: unknown, propertyName: string, access: PropertyAccess): boolean;
        function getAllPrototypesOf(target: unknown): Object[];
        function invokeAll(target: unknown, name: string, ...args: unknown[]): unknown[];
        function getAndCombineAll<T extends {}>(target: unknown, propertyName: string): T;
        function parameterNames(func: Function): string[];
        function areDeepEqual(source: unknown, target: unknown): boolean;
        function areDeepEqual(source: unknown, target: unknown, customComparer: (objA: unknown, objB: unknown) => boolean | void): boolean;
        function areShallowEqual(source: unknown, target: unknown): boolean;
        function areShallowEqual(source: unknown, target: unknown, customComparer: (objA: unknown, objB: unknown) => boolean | void): boolean;
        function wrapMethod<T extends Function, R>(target: object, method: T, delegate: (originalFunc: T, args: unknown[]) => R): R;
        function hashesOf(target: unknown): number[];
        function typeOf<T = object>(value: T): ITypeOf<T>;
    }
}
