declare type SetCookieTypes = {
  /** 键名 */
  key: string,
  /** 键值 */
  value: string,
  /** 过期时间以小时为单位 */
  expire?: number,
  /** 业务域名 */
  domain?: string,
  /** 存储路径 */
  path?: string,
}

declare type SeekTypes = {
  equal: (expression: Function | boolean, target: any) => SeekTypes,
  else: (target: any) => SeekTypes,
  get: Function,
}

declare type PollQueryTypes = {
  /** 需要轮询的函数 */
  func: Function,
  /** 轮询的间隔
   * @default 1000
   */
  interval?: number,
  /** 轮询时最多不超过的次数 
   * @default 1
   */
  execCount?: number,
}

declare type WinOpenTypes = {
  url: string,
  params?: object,
  type?: string,
  target?: string,
  getEle?: Function,
}

declare const Common: {

  /**
   * 数据类型的判断
   * @param {any} data - 需要判断的原始数据
   * @param {string} [type] - 期望的数据类型名称
   * @returns {boolean|string}
   */
  isType: (data: any, type?: string) => boolean | string,

  /**
   * 带样式的log日志
   */
  log: (...args: any) => void,

  /**
   * 数据对象继承、合并
   */
  extend: (...args: any) => object,

  /**
   * 判断空对象，不包含空字符串
   * @param {any} data - 传入的对象参数
   * @returns {boolean} 
   */
  isEmpty: (data: any) => boolean,

  /**
   * 数据克隆
   * @param {array|object} data - 需要克隆的数据
   * @returns {array|object} 克隆之后的全新数据
   */
  clone: (data: any) => any,

  /**
   * 获取客户端Cookie
   * @param {string} key - cookie键名
   * @returns {string|null}
   */
  getCookie: (key: string) => string | null,

  /**
   * 设置客户端Cookie
   * @param {string} options.key - 键名
   * @param {string} options.value - 键值
   * @param {number} options.expire - 过期时间以小时为单位
   * @param {string} options.domain - 业务域名
   * @param {string} options.path - 存储路径
   */
  setCookie: (options: SetCookieTypes) => void,

  /**
   * 删除客户端Cookie
   * @param {string} key - 需要删除的cookie键名
   */
  removeCookie: (key: string) => void,

  /**
   * 日期时间格式化
   * @param {number|date} date 时间戳、日期对象
   * @param {string} t 需要转化的日期格式
   */
  dateFormat: (date: number | Date, t: string) => string,

  /**
   * 文件下载
   * @param {object} data - 文件的Blob对象
   * @param {string} fileName - 保存的文件名称
   * @param {string} type - 文件的Type类型
   * @description 因为现在大多前后端分离，都是发接口请求，所以需要另外写这种方法完成下载功能
   */
  download: (data: Blob, fileName: string, type: string) => void,

  /**
   * 告别多重的if else switch等判断语句
   * @returns {object}
   * @exports
   * seek()
   * .equal(1+0===1, '一')
   * .equal(1+1===2, '二')
   * .equal(1+2===3, '三')
   * .else('十')
   * .get()
   */
  seek: (args?: {all: boolean}) => SeekTypes,

  /**
   * 根据uri获取其中的文件名称
   * @param {string} url - uri链接地址
   * @returns {string}
   */
  getUriFileName: (url: string) => string,

  /**
   * 根据uri获取其中的域名
   * @param {string} url - uri链接地址
   */
  getUriHostName: (url: string) => string,

  /**
   * 根据uri获取其中的pathname部分
   * @param {string} url - uri链接地址
   * @param {boolean} [search = false] - 是否带search、hash
   */
  getUriPathName: (url: string, search?: boolean) => string,

  /**
   * url parse方法
   * @param {string} url - url字符串参数
   */
  urlParse: (url: string) => object | never,

  /**
   * 金额保留N位有效小数
   * @param {string|number} n - 金额
   * @param {number} [decimal=2] - 小数位数
   * @param {boolean} least - 至少两位小数
   * @returns {string}
   */
  moneyfixed: (n: number | string, decimal?: number, least?: boolean) => string,

  /**
   * 保留两位有效小数 一般运用于金额显示
   * @param {string|number} n - 金额
   * @param {boolean} least - 至少两位小数 least为true至少两位有效小数
   * @returns {string}
   */
  money2fixed: (n: number | string, least?: boolean) => string,

  /**
   * 金额千分位处理
   * @param {number|string} n 金额
   */
  moneyFormat: (n: number | string) => string,

  /**
   * 复制文案
   * @param {string} text - 需要复制的文案
   * @returns {void}
   */
  copyText: (text: string) => void,

  /**
   * 获取url所有参数
   * @param {string} urlQuery - url路径
   * @returns {object}
   */
  getRequest: (urlQuery?: string) => any,

  /**
   * list数据向上,向下移动
   * @param {array} list - 列表list数据
   * @param {number} index - 当前操作的数据索引
   * @param {number} step - 移动的步数
   * @returns {array} - 返回移动好的list数据
   */
  moveUpDown: (list: Array<any>, index: number, step?: number) => Array<any>,

  /** 
   * unicode 转换
   * @param {string} str - 待转换的原字符串
   * @param {string} [type] - 类型
   * @returns {string}
   */
  getUnicode: (str: string, type?: 'js' | 'css' | 'html') => string,

  /**
   * 把对象转为常量只读属性
   * @param {array|object} data - 需要定义为常量的数据
   * @returns {array|object}
   */
  constant: (data: object) => object,

  /**
   * 数据删除
   * @param {array} list - 数组对象
   * @param {function} callback - 回调函数，需要返回boolean类型，告知组件方法是否需要删除该选项
   * @param {boolean} [depth] - 是否需要递归深层次的删除
   * @returns {array}
   */
  removeItems: (list: Array<any>, callback: Function, depth?: boolean) => Array<any>,

  /**
   * 将数组、对象等数据序列化操作
   * @param {array|object} data - 将要序列化操作的数据
   */
  serialize: (data: object) => object,

  /**
   * 手动触发某个事件 只运用于浏览器端
   * @param {object} ele - 节点DOM对象
   * @param {string} eventName - 事件名称
   */
  trigger: (ele: HTMLElement, eventName: string) => void,

  /**
   * 拼接参数字符串
   * @param {object} params - 数据对象参数
   * @returns {string}
   */
  queryString: (params: {[K: string]: any}) => string,

  /**
   * 轮询调用
   * @param {function} param0.func - 需要轮询的函数
   * @param {number} param0.interval - 轮询的间隔
   * @param {number} param0.execCount - 轮询时最多不超过的次数
   */
  pollQuery: (options: PollQueryTypes) => void,

  /**
   * 类似open方法 可新开启一个tab界面,支持get、post等方式
   * @param {url} options.url - 需要打开调用的url路径
   * @param {object} [options.params] - 调用url时所需要的参数
   * @param {string} [options.type] - url以某种方式调用
   * @param {string} [options.target] - 打开tab的方式，如: _blank, _new, _self 等等
   * @param {function} [options.getEle] - 获取触发DOM节点，过时即失效
   */
  winOpen: (options: WinOpenTypes) => void,

  /**
   * 添加内链样式
   * @param {string} css - css样式表
   * @param {object} [options.ele] - 添加至指定的容器里面
   * @param {object} [options.before] - 添加至指定的容器之前
   * @param {object} [options.id] - 添加id属性
   */
  appendStyle: (css: string, opt: any) => void,

  /**
   * 取深层的数据值
   * @param {object} obj - 原始数据对象
   * @param {string} keyName - 取值 链式key
   * @param {boolean} [log=true] - 是否打印错误日志
   */
  deepValue: (obj: object, keyName: string, log?: boolean) => any,

  /**
   * 过滤指定的数据
   * @param {object} obj - 将要过滤的对象
   * @param {string|array} fields - 指定需要过滤的字段名称
   * @param {boolean} ignore - 是否忽略字段
   * @returns {object} 
   */
  omit: (obj: Array<any> | object, fields: Array<string> | string, ignore?: boolean) => any,

  /**
   * 组件Key
   * 生成随机数
   */
  getRndKey: () => string,

  /**
   * 获取html纯文本、与防xss转义
   * @param {Element | string} el - DOM节点
   * @param {number} [type] - DOM节点
   */
  elementText: (el: string | Element, type?: number) => string,

  /**
   * 不同色值的转换 不支持英文色值
   * @param {string} colorValue - 色值
   * @param {boolean} [intact] - 是否返回完整的处理结果
   */
  color: (colorValue: string, intact?: boolean) => string,

  /**
   * 数字的精度问题处理
   * @param {string | number} num - 数字
   */
  decNumber: (num: string | number) => number,

  /**
   * toFixed 数字的精度问题处理
   * @param {number} num - 数字
   * @param {number} digit - 保留有效小数位数
   */
  decToFixed: (num: number, digit?: number) => string,

  /**
   * 创建默认的数据结构
   * @param {string} keyPath - 字段路径
   * @param {object} data - 数据对象
   */
  wideJson: (keyPath: string, data?: {[K: string]: any}) => object,

  /**
   * 将svg源码转换为background-image的形式，当背景用
   * 此方法一般很少用到，在此作为工具方法提供
   * @param {string} svgCode - svg源码
   */
  svg2bg: (svgCode: string) => string,

  /**
   * 判断是否NaN类型
   * @param {any} n - 待验证的数据类型
   */
  isNaN: (n: any) => boolean,

  /**
  * 睡眠、延迟方法
  * @param {number | function} timer - 睡眠时间,即毫秒数
  */
  sleep: (timer: number | Function) => Promise<any>,

  /**
   * 合并参数, 注意hash，一般运用场景少，不包含此功能
   * @param {string} url - url链接地址
   * @param {object} data - 将要拼在url后面的参数对象
   */
  concatSearch: (url: string, data?: {[K:string]: any}) => string,

  /**
   * 定时任务
   * @param {function} func - 执行主体函数
   * @param {number} [time] - 执行时间间隔
   * @param {function} [premise] - 前提条件, 主要功能针对某些情况满足条件需要自动放弃任务
   * @returns object
   */
  setTimeTask: (func: Function, time?: number, premise?: Function) => {start: Function, intact: Function, stop: Function, destruct: Function},

  /**
   * css属性支持情况
   * @param {string} name - css属性名称
   * @returns boolean
   */
  checkCssProperty: (name: string) => boolean,

   /**
    * 隐身数据展示 如：姓名、手机、身份证 等
    * @param {string} value - 字符串数据
    * @param {array} indexs - 显示位的坐标
    * @returns string
    */
  secrecy: (value: string, indexs: number[]) => string,
  
  /**
   * uuid 生成
   * @param {string} [tpl] - 生成的uuid模板
   * @returns string
   */
  uuid: (tpl?: string) => string,

  /**
   * proTable中的 valueEnum 与 dataSource数据结构互转
   * @param {array|object} data - 需要转换的数据
   */
  enumSource: (data: any) => any,

  /**
   * 简单的防爆处理函数, 简单的场景可以适用, 严格场景还是采用节流、防抖来处理比较好
   * @param {number} sleep - 相隔下个事务处理间隔的秒数
   */
  burst: (sleep?: number) => boolean,

  /**
   * 多个参数、对象之间的数据合并操作
   * 与assign最大不同之处就是assign没有排除忽略字段，如果undefined也会合并过来
   * 偶尔有些时候不满足业务要求, merge的忽略字段默认为[undefined]
   * 如果想更换忽略参数，按Array格式传进merge的最后一个参数里即可
   * @example
   * ```
   * merge({name: '福虎'}, {name: undefined, sex: '男'}, {wechat: 'TanShenghu'});
   * // 结果: {name: '福虎', sex: '男', wechat: 'TanShenghu'}
   * ```
   */
  merge: (...args: any) => object,
  
}

export default Common;