import './array';
import './object';
export declare enum PropertyAccess {
    CanRead = 0,
    CanWrite = 1
}
declare global {
    namespace Reflect {
        interface IEndOfPathAction {
            value: unknown;
            shouldContinue: boolean;
        }
        interface TypeOf<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;
        }
        interface WalkerProperty<T = unknown> {
            name: string;
            path: (string | number)[];
            parent: object | undefined;
            descriptor: PropertyDescriptor;
            propertyIndex: number;
            get(): T;
            set(value: T): void;
        }
        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 bindAllMethodsOn(target: unknown): void;
        function invoke(target: unknown, name: string, ...args: unknown[]): unknown;
        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): TypeOf<T>;
        function walk(target: object, onProperty: (property: Reflect.WalkerProperty) => void | false): void;
        function getByPath<T = unknown>(target: object, propertyKey: string): {
            wasFound: boolean;
            value: T;
        };
        function setByPath<T = unknown>(target: object, propertyKey: string, value: T): boolean;
        function setByPath<T = unknown>(target: object, propertyKey: string, value: T, createPathIfNotExists: boolean): boolean;
    }
}
