/**
 * JavaScript 函数库、工具类
 */
declare namespace XEUtils {

  export interface DefaultOptions {
    treeOptions?: any;
    formatDate?: string;
    formatString?: string;
    dateDiffRules?: any[][];
  }





  /**
   * 版本信息
   */
  export var v: string;
  /**
   * 设置全局参数
   * @param options 全局参数
   */
  export function setup(options: DefaultOptions): void;

  /**
   * 将您自己的实用函数扩展到 XEUtils
   * @param methods 函数集
   */
  export function mixin(...methods: any[]): void;




  /**
   * 浅拷贝一个或者多个对象到目标对象中
   * @param target 目标对象
   * @param sources 多个对象
  */
  export function assign(target: any, ...sources: any[]): any;






  /**
   * 浅拷贝一个或者多个对象到目标对象中
   * @param target 目标对象
   * @param sources 多个对象
  */
  export function extend(target: any, ...sources: any[]): any;






  /**
   * 指定方法后的返回值组成的新对象
   * @param obj 对象
   * @param iteratee 回调
   * @param context 上下文
   */
  export function objectMap(obj: any, iteratee: Function, context?: any): any;






  export function objectEachIterate(item: any, index: string, obj: any): any;

  /**
   * 对象迭代器
   * @param obj 对象
   * @param iteratee 回调 
   * @param context 上下文
   */
  export function objectEach(obj: any, iteratee: typeof objectEachIterate, context?: any): void;






  /**
   * 对象迭代器,从最后开始迭代
   * @param obj 对象
   * @param iteratee 回调 
   * @param context 上下文
   */
  export function lastObjectEach(obj: any, iteratee: Function, context?: any): void;






  /**
   * 数组去重
   * @param array 数组
   */
  export function uniq(array: any[]): any[];






  /**
   * 将多个数的值返回唯一的并集数组
   * @param array 数组
   */
  export function union(...array: any[]): any[];






  /**
   * 数组按属性值升序
   * @param array 数组
   * @param iteratee 回调/属性
   * @param context 上下文
   */
  export function sortBy(array: any[], iteratee: any[] | Function | string, context?: any): any[];






  /**
   * 将一个数组随机打乱，返回一个新的数组
   * @param array 数组
    */
  export function shuffle(array: any[]): any[];






  /**
   * 从一个数组中随机返回几个元素
   * @param array 数组
   * @param number 返回个数
   * @example 
   */
  export function sample(array: any[], number?: number): any[];






  /**
   * 对象中的值中的每一项运行给定函数,如果函数对任一项返回 true,则返回 true,否则返回 false
   * @param array 数组
   * @param iteratee 回调
   * @param context 上下文
   */
  export function some(array: any[], iteratee: Function, context?: any): any[];






  /**
   * 对象中的值中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true,否则返回 false
   * @param array 数组
   * @param iteratee 回调
   * @param context 上下文
   */
  export function every(array: any[], iteratee: Function, context?: any): any[];






  /**
   * slice ( array, start, end ) 裁剪 Arguments 或数组 array，从 start 位置开始到 end 结束，但不包括 end 本身的位置
   * @param array 对象
   * @param start 迭代器/属性
   * @param end 上下文
   */
  export function slice(array: any[], start?: number, end?: number): any[];






  /**
   * 查找匹配第一条数据
   * @param array 数组
   * @param iteratee 回调
   * @param context 上下文
   */
  export function filter(array: any[], iteratee: Function, context?: any): any[];






  /**
   * 查找匹配第一条数据
   * @param array 数组
   * @param iteratee 回调
   * @param context 上下文
   */
  export function find(array: any[], iteratee: Function, context?: any): any;






  /**
   * 查找匹配第一条数据的键
   * @param array 数组
   * @param iteratee 回调
   * @param context 上下文
   */
  export function findKey(array: any[], iteratee: Function, context?: any): any;






  /**
   * 判断对象是否包含该值,成功返回 true 否则 false
   * @param obj 对象
   * @param val 值
   */
  export function includes(obj: any, val: any): boolean;






  /**
   * 返回数组第一个索引值
   * @param obj 数组
   * @param val 值
   */
  export function arrayIndexOf(obj: any, val: any): number;






  /**
   * 从最后开始的索引值,返回数组第一个索引值
   * @param obj 数组
   * @param val 值
   */
  export function arrayLastIndexOf(obj: any, val: any): number;






  /**
   * 指定方法后的返回值组成的新数组
   * @param array 数组
   * @param iteratee 回调
   * @param context 上下文
   */
  export function map(array: any[], iteratee: Function, context?: any): any[];






  /**
   * 求和函数，将数值相加
   * @param obj 对象/数组
   * @param iteratee 回调
   * @param context 上下文
   */
  export function sum(obj: any, iteratee?: Function, context?: any): number;






  /**
   * 求平均值函数
   * @param array 对象/数组
   * @param iteratee 回调
   * @param context 上下文
   */
  export function mean(obj: any, iteratee?: Function, context?: any): number;






  /**
   * 接收一个函数作为累加器，数组中的每个值（从左到右）开始合并，最终为一个值
   * @param array 数组
   * @param iteratee 回调
   * @param initialValue 默认值
   * @example 
   */
  export function reduce(array: any[], iteratee?: Function, initialValue?: any): any;






  /**
   * 复制数组的一部分到同一数组中的另一个位置,数组大小不变
   * @param array 数组
   * @param target 从该位置开始替换数据
   * @param start 从该位置开始读取数据，默认为 0 。如果为负值，表示倒数
   * @param end 到该位置前停止读取数据，默认等于数组长度。如果为负值，表示倒数
   */
  export function copyWithin(array: any[], target: number, start?: Number, end?: number): any[];






  /**
   * 将一个数组分割成大小的组。如果数组不能被平均分配，那么最后一块将是剩下的元素
   * @param array 数组
   * @param size 每组大小
   */
  export function chunk(array: any[], size: number): any[];






  /**
   * 将每个数组中相应位置的值合并在一起
   * @param arrays 多个数组
   */
  export function zip(...arrays: any[]): any[];






  /**
   * 与 zip 相反
   * @param arrays 数组
   */
  export function unzip(arrays: any[]): any[];






  /**
   * 将每个数组中相应位置的值合并在一起
   * @param props 键数组
   * @param values 值数组
   * @example 
   */
  export function zipObject(props: any[], values: any[]): any;






  /**
   * 将对象或者伪数组转为新数组
   * @param array 对象/数组
   */
  export function toArray(obj: any): any[];






  /**
   * 判断数组是否包含另一数组
   * @param array1 数组
   * @param array2 数组
   */
  export function includeArrays(array1: any[], array2: any[]): boolean;






  /**
   * 获取数组对象中某属性值，返回一个数组
   * @param array 数组
   * @param key 键
   * @example 
   */
  export function pluck(array: any[], key: string): any[];






  /**
   * 获取数组对象中某属性值，返回一个数组
   * @param array 数组
   * @param key 键
   * @example 
   */
  export function invoke(list: any[], path: string[] | string | Function): any[];






  /**
   * 获取数组对象中某属性值，返回一个数组
   * @param array 数组
   * @param key 键
   * @example 
   */
  export function invokeMap(list: any[], path: string[] | string | Function): any[];






  export function arrayEachIterate(item: any, index: number, list: any[]): any;

  /**
   * 数组迭代器
   * @param obj 对象
   * @param iteratee 回调 
   * @param context 上下文
   */
  export function arrayEach(obj: any, iteratee: typeof arrayEachIterate, context?: any): void;






  /**
   * 数组迭代器,从最后开始迭代
   * @param obj 对象
   * @param iteratee 回调 
   * @param context 上下文
   */
  export function lastArrayEach(obj: any, iteratee: Function, context?: any): void;






  export interface toArrayTreeOptions {
    strict?: boolean;
    key?: string;
    parentKey?: string;
    children?: string;
    sortKey?: string;
    reverse?: string;
    data?: string;
  }

  /**
   * 将一个带层级的数据列表转成树结构
   * @param {Array} array 数组
   * @param {Object} options {strict: false, parentKey: 'parentId', key: 'id', children: 'children', data: 'data'}
   */
  export function toArrayTree(array: any[], options?: toArrayTreeOptions): any[];






  export interface toTreeArrayOptions {
    children?: string;
    data?: string;
  }

  /**
   * 将一个树结构转成数组列表
   * @param {Array} array 数组
   * @param {Object} options {children: 'children', data: 'data'}
   */
  export function toTreeArray(array: any[], options?: toTreeArrayOptions): any[];






  export function findTreeIterate(item: any, index: number, items: any[], path: Array<string>, parent: any, nodes: any[]): any;

  interface TerrResult {
    index?: number;
    item?: any;
    path?: Array<string>;
    items?: any[];
    parent?: any;
    nodes?: any[];
  }

  interface findTreeOptions {
    children?: string;
  }

  /**
   * 从树结构中查找匹配第一条数据的键、值、路径
   * @param {Object} obj 对象/数组
   * @param {Function} iterate(item, index, items, path, parent, nodes) 回调
   * @param {Object} options {children: 'children'}
   * @param {Object} context 上下文
   */
  export function findTree(array: any[], iterate: typeof findTreeIterate, options?: findTreeOptions, context?: any): TerrResult;






  export function eachTreeIterate(item: any, index: number, items: any[], path: Array<string>, parent: any, nodes: any[]): any;

  export interface eachTreeOptions {
    children?: string;
  }

  /**
   * 从树结构中遍历数据的键、值、路径
   * @param {Object} obj 对象/数组
   * @param {Function} iterate(item, index, items, path, parent, nodes) 回调
   * @param {Object} options {children: 'children'}
   * @param {Object} context 上下文
   */
  export function eachTree(array: any[], iterate: typeof eachTreeIterate, options?: eachTreeOptions, context?: any): void;






  export function mapTreeIterate(item: any, index: number, items: any[], path: Array<string>, parent: any, nodes: any[]): any;

  interface mapTreeOptions {
    children?: string;
    mapChildren?: string;
  }

  /**
   * 从树结构中指定方法后的返回值组成的新数组
   * @param {Object} obj 对象/数组
   * @param {Function} iterate(item, index, items, path, parent, nodes) 回调
   * @param {Object} options {children: 'children', mapChildren: 'children}
   * @param {Object} context 上下文
   */
  export function mapTree(array: any[], iterate: typeof mapTreeIterate, options?: mapTreeOptions, context?: any): any[];






  export function filterTreeIterate(item: any, index: number, items: any[], path: Array<string>, parent: any, nodes: any[]): any;

  export interface filterTreeOptions {
    children?: string;
  }

  /**
   * 从树结构中根据回调过滤数据
   * @param {Object} obj 对象/数组
   * @param {Function} iterate(item, index, items, path, parent) 回调
   * @param {Object} options {children: 'children'}
   * @param {Object} context 上下文
   */
  export function filterTree(array: any[], iterate: typeof filterTreeIterate, options?: filterTreeOptions, context?: any): any[];






  export function searchTreeIterate(item: any, index: number, items: any[], path: Array<string>, parent: any, nodes: any[]): any;

  export interface searchTreeOptions {
    children?: string;
    mapChildren?: string;
    original?: boolean;
  }

  /**
   * 从树结构中根据回调查找数据
   * @param {Object} obj 对象/数组
   * @param {Function} iterate(item, index, items, path, parent, nodes) 回调
   * @param {Object} options {children: 'children'}
   * @param {Object} context 上下文
   */
  export function searchTree(array: any[], iterate: typeof searchTreeIterate, options?: searchTreeOptions, context?: any): any[];






  /**
   * 判断对象自身属性中是否具有指定的属性
   * @param obj 对象
   * @param key 键值
   */
  export function hasOwnProp(obj: any, key: string | number): boolean;






  /**
   * 判断是否 undefined 和 null
   * @param obj 对象
   */
  export function eqNull(obj: any): boolean;






  /**
   * 判断是否非数值
   * @param val 值
   */
  export function isNaN(val: any): boolean;






  /**
   * 判断是否为有限数值
   * @param val 值
   */
  export function isFinite(val: any): boolean;






  /**
   * 判断 Undefined
   * @param val 值
   */
  export function isUndefined(val: any): boolean;






  /**
   * 判断是否数组
   * @param val 值
   */
  export function isArray(val: any): boolean;






  /**
   * 判断是否小数
   * @param val 值
   */
  export function isFloat(val: any): boolean;






  /**
   * 判断是否整数
   * @param val 值
   */
  export function isInteger(val: any): boolean;






  /**
   * 判断是否方法
   * @param val 值
   */
  export function isFunction(val: any): boolean;






  /**
   * 判断是否 Boolean 对象
   * @param val 值
   */
  export function isBoolean(val: any): boolean;






  /**
   * 判断是否String对象
   * @param val 值
   */
  export function isString(val: any): boolean;






  /**
   * 判断是否 Number 对象
   * @param val 值
   */
  export function isNumber(val: any): boolean;






  /**
   * 判断是否 RegExp 对象
   * @param val 值
   */
  export function isRegExp(val: any): boolean;






  /**
   * 判断是否 Object 对象
   * @param val 值
   */
  export function isObject(val: any): boolean;






  /**
   * 判断是否是一个对象
   * @param val 值
   */
  export function isPlainObject(val: any): boolean;






  /**
   * 判断是否 Date 对象
   * @param val 值
   */
  export function isDate(val: any): boolean;






  /**
   * 判断是否 Error 对象
   * @param val 值
   */
  export function isError(val: any): boolean;






  /**
   * 判断是否 TypeError 对象
   * @param val 值
   */
  export function isTypeError(val: any): boolean;






  /**
   * 判断是否为空对象
   * @param val 值
   */
  export function isEmpty(val: any): boolean;






  /**
   * 判断是否为 Null
   * @param val 值
   */
  export function isNull(val: any): boolean;






  /**
   * 判断是否 Symbol 对象
   * @param val 值
   */
  export function isSymbol(val: any): boolean;






  /**
   * 判断是否 Arguments 对象
   * @param val 值
   */
  export function isArguments(val: any): boolean;






  /**
   * 判断是否 Element 对象
   * @param val 值
   */
  export function isElement(val: any): boolean;






  /**
   * 判断是否 Document 对象
   * @param val 值
   */
  export function isDocument(val: any): boolean;






  /**
   * 判断是否 Window 对象
   * @param val 值
   */
  export function isWindow(val: any): boolean;






  /**
   * 判断是否 FormData 对象
   * @param val 值
   */
  export function isFormData(val: any): boolean;






  /**
   * 判断是否 Map 对象
   * @param val 值
   */
  export function isMap(val: any): boolean;






  /**
   * 判断是否 WeakMap 对象
   * @param val 值
   */
  export function isWeakMap(val: any): boolean;






  /**
   * 判断是否 Set 对象
   * @param val 值
   */
  export function isSet(val: any): boolean;






  /**
   * 判断是否 WeakSet 对象
   * @param val 值
   */
  export function isWeakSet(val: any): boolean;






  /**
   * 判断是否闰年
   * @param date 日期
   */
  export function isLeapYear(date?: Date | number | string): boolean;






  /**
   * 判断属性中的键和值是否包含在对象中
   * @param obj 对象
   * @param source 值
   */
  export function isMatch(obj: any, source: any): boolean;






  /**
   * 深度比较两个对象之间的值是否相等
   * @param obj1 值1
   * @param obj2 值2
   */
  export function isEqual(obj1: any, obj2: any): boolean;






  /**
   * 深度比较两个对象之间的值是否相等，使用自定义比较函数
   * @param obj1 值1
   * @param obj2 值2
   * @param func 自定义函数
   */
  export function isEqualWith(obj1: any, obj2: any, func?: Function): boolean;






  /**
   * 获取对象类型
   * @param obj 对象
   */
  export function getType(obj: any): string;






  /**
   * 获取一个全局唯一标识
   * @param prefix 自定义前缀
   */
  export function uniqueId(prefix?: string): string;






  /**
   * 返回对象的长度
   * @param obj 对象
   */
  export function getSize(obj: any): number;






  /**
   * 返回对象第一个索引值
   * @param obj 对象
   * @param val 值
   */
  export function indexOf(obj: any, val: any): any;






  /**
   * 从最后开始的索引值,返回对象第一个索引值
   * @param obj 对象
   * @param val 值
   */
  export function lastIndexOf(obj: any, val: any): any;






  /**
   * 返回对象第一个索引值
   * @param obj 对象
   * @param iteratee 迭代器/属性
   * @param context 上下文
   */
  export function findIndexOf(obj: any, iteratee: any, context?: any): any;






  /**
   * 从最后开始的索引值,返回对象第一个索引值
   * @param obj 对象
   * @param iteratee 迭代器/属性
   * @param context 上下文
   */
  export function findLastIndexOf(obj: any, iteratee: any, context?: any): any;






  /**
   * 字符串转 JSON
   * @param str 字符串
   */
  export function toStringJSON(str: string): any;






  /**
   * JSON 转字符串
   * @param obj 对象
   */
  export function toJSONString(obj: any): string;






  /**
   * 获取对象所有属性
   * @param obj 对象
   */
  export function keys(obj: any): any[];







  /**
   * 获取对象所有值
   * @param obj 对象
   */
  export function values(obj: any): any[];






  /**
   * 获取对象所有属性、值
   * @param obj 对象
   */
  export function entries(obj: any): any[];






  /**
   * 根据 keys 过滤指定的属性值，返回一个新的对象
   * @param obj 对象
   * @param array 数组或字符串或方法
   */
  export function pick(obj: any, array: Array<string>): any;






  /**
   * 根据 keys 排除指定的属性值，返回一个新的对象
   * @param obj 对象
   * @param array 数组或字符串或方法
   */
  export function omit(obj: any, array: Array<string>): any;






  /**
   * 获取对象第一个值
   * @param obj 对象
   */
  export function first(obj: any): any;






  /**
   * 获取对象最后一个值
   * @param obj 对象
   */
  export function last(obj: any): any;






  export function eachIterate(item: any, index: any, obj: any): any;

  /**
   * 通用迭代器
   * @param obj 对象
   * @param iteratee 回调 
   * @param context 上下文
   */
  export function each(obj: any, iteratee: typeof eachIterate, context?: any): void;







  /**
   * 迭代器,支持 return false 跳出循环 break
   * @param obj 对象
   * @param iteratee 回调 
   * @param context 上下文
   */
  export function forOf(obj: any, iteratee: Function, context?: any): void;






  /**
   * 迭代器,从最后开始迭代,支持 return false 跳出循环 break
   * @param obj 对象
   * @param iteratee 回调 
   * @param context 上下文
   */
  export function lastForOf(obj: any, iteratee: Function, context?: any): void;






  /**
   * 通用迭代器,从最后开始迭代
   * @param obj 对象
   * @param iteratee 回调 
   * @param context 上下文
   */
  export function lastEach(obj: any, iteratee: Function, context?: any): void;






  /**
   * 检查键、路径是否是该对象的属性
   * @param obj 对象
   * @param property 键、路径
   */
  export function has(obj: any, property: string | Array<string>): boolean;






  /**
   * 获取对象的属性的值，如果值为 undefined，则返回默认值
   * @param obj 对象
   * @param property 键、路径
   * @param defaultValue 默认值
   */
  export function get(obj: any, property: string | Array<string>, defaultValue?: any): any;






  /**
   * 设置对象属性上的值。如果属性不存在则创建它
   * @param obj 对象
   * @param property 键、路径
   * @param value 值
   */
  export function set(obj: any, property: string | Array<string>, value: any): void;






  /**
   * 集合分组,默认使用键值分组,如果有 iteratee 则使用结果进行分组
   * @param obj 对象
   * @param iteratee 回调/属性
   * @param context 上下文
   */
  export function groupBy(obj: any, iteratee: Function, context?: any): any;






  /**
   * 集合分组统计,返回各组中对象的数量统计
   * @param obj 对象
   * @param iteratee 回调/属性
   * @param context 上下文
   */
  export function countBy(obj: any, iteratee: Function, context?: any): any;






  /**
   * 浅拷贝/深拷贝
   * @param obj 对象
   * @param deep 是否深拷贝
   */
  export function clone(obj: any, deep?: boolean): any;






  /**
   * 清空对象; defs如果不传（清空所有属性）、如果传对象（清空并继承)、如果传值(给所有赋值)
   * @param obj 对象
   * @param defs 默认值
   * @param assigns 值
   */
  export function clear(obj: any, defs?: any, assigns?: any): any;






  /**
   * 移除对象属性
   * @param obj 对象
   * @param iteratee 迭代器/值
   */
  export function remove(obj: any, iteratee: any): any;






  /**
   * 序号列表生成函数
   * @param start 起始值
   * @param stop 结束值
   * @param step 自增值
   */
  export function range(start: number, stop: number, step?: number): any[];






  /**
   * 将一个或者多个对象值解构到目标对象
   * @param obj 对象
   * @param target 目标
   */
  export function destructuring(obj: any, ...target: any[]): any;






  /**
   * 获取一个指定范围内随机数
   * @param min 最小值
   * @param max 最大值
   */
  export function random(min: number, max: number): number;






  /**
   * 获取最小值
   * @param array 数组
   * @param iteratee 回调/属性
   */
  export function min(array: any[], iteratee: string | Function): number;






  /**
   * 获取最大值
   * @param array 数组
   * @param iteratee 回调/属性
   */
  export function max(array: any[], iteratee: string | Function): number;






  export interface CommafyOptions {
    /**
     * 分割位数,默认3
     */
    spaceNumber: number;
    /**
     * 分隔符,默认','
     */
    separator: string;
    /**
     * 小数位数,默认null
     */
    fixed: number;
  }

  /**
   * 数值千分位分隔符、小数点
   * @param num 数值/字符串
   * @param options 可选参数
   */
  export function commafy(num: string | number, options?: CommafyOptions): string;






  /**
   * 和 Number.toFixed 类似，区别就是不会对小数进行四舍五入，结果返回字符串
   * @param num 数值/字符串
   * @param digits 小数保留位数
   */
  export function toFixedString(num: string | number, digits: number): string;






  /**
   * 和 Number.toFixed 类似，区别就是不会对小数进行四舍五入，结果返回数值
   * @param num 数值/字符串
   * @param digits 小数保留位数
   */
  export function toFixedNumber(num: string | number, digits: number): number;






  /**
   * 转数值
   * @param num 数值/字符串
   */
  export function toNumber(num: string | number): number;






  /**
   * 转整数
   * @param num 数值/字符串
   */
  export function toInteger(num: string | number): number;






  /**
   * 返回当前时间戳
   */
  export function now(): number;






  /**
   * 将日期转为时间戳
   * @param date 字符串/日期/时间戳
   * @param format 解析格式 yyyy MM dd HH mm ss SSS
   */
  export function timestamp(date: string | Date | number, format?: string): number;






  /**
   * 判断两个日期是否相同
   * @param date1 日期
   * @param date2 日期
   * @param format 格式化
   */
  export function isDateSame(date1: Date | number | string, date2: Date | number | string, format?: string): boolean;






  /**
   * 任意格式字符串转为日期
   * @param str 字符串/日期/时间戳
   * @param format 解析格式 yyyy MM dd HH mm ss SSS
   */
  export function toStringDate(str: string | Date | number, format?: string): Date;






  export interface ToDateStringOptions {
    /**
     * 自定义格式化模板
     * {
     *   formats: {
     *     q: ['日', '一', '二', '三', '四', '五', '六'], 
     *     E: function (value, match, date) { return '三' }
     *   }
     * }
     */
    formats?: any
  }

  /**
   * 日期格式化为任意格式字符串
   * @param date 字符串/日期/时间戳
   * @param format 格式化 默认：yyyy-MM-dd HH:mm:ss.SSS
   * @param options 可选参数
   */
  export function toDateString(date: string | Date | number, format?: string, options?: ToDateStringOptions): string;






  /**
   * 返回前几年或后几年的日期,可以指定年初(first)、年末(last)、月份(0~11)，默认当前
   * @param date 字符串/日期/时间戳
   * @param year 年(默认当前年)、前几个年(数值)、后几个年(数值)
   * @param month 获取哪月(null默认当前年)、年初(first)、年末(last)、指定月份（0-11）
   */
  export function getWhatYear(date: string | Date | number, year?: number | string, month?: number | string): Date;






  /**
   * 返回前几月或后几月的日期,可以指定月初(first)、月末(last)、天数，默认当前
   * @param date 字符串/日期/时间戳
   * @param month 月(默认当前月)、前几个月、后几个月
   * @param day 获取哪天(null默认当前天)、月初(first)、月末(last)、指定天数(数值)
   */
  export function getWhatMonth(date: string | Date | number, month?: number | string, day?: number | string): Date;






  /**
   * 返回前几周或后几周的日期,可以指定星期几(0~6)，默认当前
   * @param date 字符串/日期/时间戳
   * @param month 周(默认当前周)、前几周、后几周
   * @param day 星期天(默认0)、星期一(1)、星期二(2)、星期三(3)、星期四(4)、星期五(5)、星期六(6)
   */
  export function getWhatWeek(date: string | Date | number, week?: number | string, day?: number | string): Date;






  /**
   * 返回前几天或后几天的日期
   * @param date 字符串/日期/时间戳
   * @param day 天(默认当天)、前几天、后几天
   * @param mode 获取时分秒(null默认当前时分秒)、日初(first)、日末(last)
   */
  export function getWhatDay(date: string | Date | number, day?: number, mode?: number | string): Date;






  /**
   * 返回某个年份的第几天
   * @param date 字符串/日期/时间戳
   */
  export function getYearDay(date: string | Date | number): number;






  /**
   * 返回某个年份的第几周
   * @param date 字符串/日期/时间戳
   */
  export function getYearWeek(date: string | Date | number): number;






  /**
   * 返回某个月份的第几周
   * @param date 字符串/日期/时间戳
   */
  export function getMonthWeek(date: string | Date | number): number;






  /**
   * 返回某个年份的天数,可以指定前几个年或后几个年，默认当前
   * @param date 字符串/日期/时间戳
   * @param year 年(默认当年)、前几个年、后几个年
   */
  export function getDayOfYear(date: string | Date | number, year?: number): Date;






  /**
   * 返回某个月份的天数,可以指定前几个月或后几个月，默认当前
   * @param date 字符串/日期/时间戳
   * @param month 月(默认当月)、前几个月、后几个月
   */
  export function getDayOfMonth(date: string | Date | number, month: number): number;






  export interface dateDiffResult {
    /**
     * 是否计算完成（如果结束日期小于开始日期 done 为 fasle）
     */
    done: boolean;
    /**
     * 相差多少毫秒
     */
    time: Number;
    /**
     * 年
     */
    yyyy: number;
    /**
     * 月
     */
    MM: number;
    /**
     * 日
     */
    dd: number;
    /**
     * 时
     */
    HH: number;
    /**
     * 分
     */
    mm: number;
    /**
     * 秒
     */
    ss: number;
    /**
     * 毫秒
     */
    S: number;
  }

  /**
   * 返回两个日期之间差距,如果结束日期小于开始日期 done 为 fasle
   * @param startDate 开始日期
   * @param endDate 结束日期或当期日期
   * @param rules 自定义计算规则
   */
  export function getDateDiff(startDate: string | Date | number, endDate: string | Date | number, rules?: any[][]): dateDiffResult;






  /**
   * 去除字符串左右两边的空格
   * @param str 字符串
   */
  export function trim(str: string): string;






  /**
   * 去除字符串左边的空格
   * @param str 字符串
   */
  export function trimLeft(str: string): string;






  /**
   * 去除字符串右边的空格
   * @param str 字符串
   */
  export function trimRight(str: string): string;






  /**
   * 转义HTML字符串，替换&, <, >, ", ', \`字符
   * @param str 字符串
   */
  export function escape(str: string): string;






  /**
   * 反转 escape
   * @param str 字符串
   */
  export function unescape(str: string): string;







  /**
   * 将带驼峰字符串转成字符串
   * @param str 字符串
   */
  export function camelCase(str: string): string;






  /**
   * 将字符串转成驼峰字符串
   * @param str 字符串
   */
  export function kebabCase(str: string): string;






  /**
   * 将字符串重复 n 次
   * @param str 字符串
   * @param count 次数
   */
  export function repeat(str: string, count: number): string;






  /**
   * 用指定字符从前面开始补全字符串
   * @param str 字符串
   * @param targetLength 结果长度
   * @param padString 补全字符
   */
  export function padStart(str: string, targetLength: number, padString?: string): string;






  /**
   * 用指定字符从后面开始补全字符串
   * @param str 字符串
   * @param targetLength 结果长度
   * @param padString 补全字符
   */
  export function padEnd(str: string, targetLength: number, padString?: string): string;






  /**
   * 判断字符串是否在源字符串的头部
   * @param str 字符串
   * @param val 值
   * @param startIndex 开始索引
   */
  export function startsWith(str: string, val: string, startIndex?: number): string;






  /**
   * 判断字符串是否在源字符串的头部
   * @param str 字符串
   * @param val 值
   * @param startIndex 开始索引
   */
  export function endsWith(str: string, val: string, startIndex?: number): string;






  /**
   * 解析动态字符串模板
   * @param str 字符串模板
   * @param obj 对象
   */
  export function template(str: string, obj: any): string;






  /**
   * 转字符串
   * @param obj 值
   */
  export function toString(obj: any): string;






  /**
   * 返回一个获取对象属性的函数
   * @param path 键值
   */
  export function property(path: string): Function;






  /**
   * 创建一个绑定上下文的函数
   * @param callback 回调
   * @param context 上下文
   * @param params 额外的参数
   */
  export function bind(callback: Function, context?: any, ...params: any[]): Function;






  /**
   * 创建一个只能调用一次的函数,只会返回第一次执行后的结果
   * @param callback 回调
   * @param context 上下文
   * @param params 额外的参数
   */
  export function once(callback: Function, context?: any, ...params: any[]): Function;






  /**
   * 创建一个函数, 调用次数超过 count 次之后执行回调并将所有结果记住后返回
   * @param count 次数
   * @param callback 回调
   * @param context 上下文
   */
  export function after(count: number, callback: Function, context?: any): Function;






  /**
   * 创建一个函数, 调用次数不超过 count 次之前执行回调并将所有结果记住后返回
   * @param count 次数
   * @param callback 回调
   * @param context 上下文
   */
  export function before(count: number, callback: Function, context?: any): Function;






  export interface ThrottleOptions {
    /**
     * 是否在之前执行
     */
    leading?: boolean;
    /**
     * 是否在之后执行
     */
    trailing?: boolean;
  }

  /**
   * 创建一个策略函数，当被重复调用函数的时候，至少每隔多少秒毫秒调用一次该函数
   * @param callback 回调
   * @param wait 毫秒
   * @param options 可选参数
   */
  export function throttle(callback: Function, wait: number, options?: ThrottleOptions): Function;






  export interface DebounceOptions {
    /**
     * 是否在之前执行
     */
    leading?: boolean;
    /**
     * 是否在之后执行
     */
    trailing?: boolean;
  }

  /**
   * 创建一个防反跳策略函数，在函数最后一次调用多少毫秒之后才会再次执行，如果在期间内重复
   * @param callback 回调
   * @param wait 毫秒
   * @param options 可选参数
   */
  export function debounce(callback: Function, wait: number, options: DebounceOptions): Function;






  /**
   * 该方法和 setTimeout 一样的效果，区别就是支持上下文和额外参数
   * @param callback 回调
   * @param wait 延迟毫秒
   * @param params 额外的参数
   */
  export function delay(callback: Function, wait: number, ...params: any[]): number;






  export interface XEUrl {
    /**
     * 获取完整的地址
     */
    href: string;
    /**
     * 获取 #Hash 的完整字符串
     */
    hash: string;
    /**
     * 获取主机信息
     */
    host: string;
    /**
     * 主机主机名
     */
    hostname: string;
    /**
     * 获取地址的协议类型
     */
    protocol: string;
    /**
     * 获取端口信息
     */
    port: string;
    /**
     * 查询字符串
     */
    search: string;
    /**
     * 获取路径字符串
     */
    pathname: string;
    /**
     * 获取 #hash 键值
     */
    origin: string;
    /**
     * 获取 #hash 键值，不包括参数
     */
    hashKey: string;
    /**
     * 获取 #hash 对象参数
     */
    hashQuery: any;
    /**
     * 获取查询对象参数
     */
    searchQuery: any;
  }

  /**
   * 解析 URL 参数
   * @param ulr 字符串
   */
  export function parseUrl(ulr: string): XEUrl;






  /**
   * 判断字符串是否在源字符串的头部
   * @param query 序列化的对象
   */
  export function serialize(query: any): string;






  /**
   * 判断字符串是否在源字符串的头部
   * @param str 反序列化的字符串
   */
  export function unserialize(str: string): any;






  /**
   * 获取上下文路径
   */
  export function getBaseURL(): string;







  /**
   * 获取地址栏信息
   */
  export function locat(): XEUrl;






  export interface XEBrowse {
    /**
     * 判断是否 NodeJs 环境
     */
    isNode: boolean;
    /**
     * 判断是否有 document 元素
     */
    isDoc: boolean;
    /**
     * 判断是否 Edge 浏览器
     */
    edge: boolean;
    /**
     * 判断是否 Firefox 浏览器
     */
    firefox: boolean;
    /**
     * 判断是否 IE 浏览器
     */
    msie: boolean;
    /**
     * 判断是否 Safari 浏览器
     */
    safari: boolean;
    /**
     * 判断是否移动端
     */
    isMobile: boolean;
    /**
     * 判断是否 PC 端
     */
    isPC: boolean;
    /**
     * 判断浏览器是否支持 LocalStorage
     */
    isLocalStorage: boolean;
    /**
     * 判断浏览器是否支持 SessionStorage
     */
    isSessionStorage: boolean;
    /**
     * 判断浏览器是否 -webkit 内核
     */
    '-webkit': boolean;
    /**
     * 判断浏览器是否 -moz 内核
     */
    '-moz': boolean;
    /**
     * 判断浏览器是否 -ms 内核
     */
    '-ms': boolean;
    /**
     * 判断浏览器是否 -o 内核
     */
    '-o': boolean;
  }

  /**
   * 获取浏览器信息
   */
  export function browse(): XEBrowse;






  export interface CookieOptions {
    /**
     * 键
     */
    name?: string;
    /**
     * 值
     */
    value?: string;
    /**
     * 路径
     */
    path?: string;
    /**
     * 作用域
     */
    domain?: string;
    /**
     * 设置为安全的,只能用https协议
     */
    secure?: string;
    /**
     * 过期时间,可以指定日期或者字符串，默认天
     */
    expires?: string;
  }

  export interface XECookie {
    /**
     * 根据 name 判断 Cookie 是否存在
     * @param name 键
     */
    isKey(name: string): boolean;

    /**
     * 添加 Cookie
     * @param name 键
     * @param value 值
     * @param options 可选参数
     */
    setItem(name: string, value: any, options?: CookieOptions): this;

    /**
     * 根据 name 获取 Cookie
     * @param name 键
     */
    getItem(name: string): string;

    /**
     * 根据 name 删除 Cookie
     * @param name 键
     * @param options 可选参数
     */
    removeItem(name: string, options?: CookieOptions): number;

    /**
     * 获取 Cookie 所有键
     */
    keys(): any[];

    /**
     * 获取所有 Cookie
     */
    getJSON(): any;
  }

  /**
   * Cookie 操作函数
   * @param name 键/数组/对象
   * @param value 值
   * @param options 可选参数 
   */
  export function cookie(): XECookie;
  export function cookie(name: string, value?: any, options?: CookieOptions): XECookie;



}