import { Observable } from 'rxjs';

interface KVInfo<T extends unknown = any> {
    k: string;
    v: any;
    o?: {
        k: string;
        v: any;
        subArr?: T[];
        o?: T;
    };
}
interface SVInfo<T extends unknown = any> {
    v: string;
    s: any;
    o?: {
        v: string;
        s: any;
        subArr?: T[];
        o?: T;
    };
}
interface TextValue<T extends unknown = any> {
    value: any;
    text: string;
    o?: {
        value: any;
        text: string;
        subArr?: T[];
        o?: T;
    };
}
/**
 * 字典工具类
 */
declare class DictUtil {
    /****************************** TextValue Start*****************************************/
    /**
     * 把obj字典对象转换为TextValue数组(textValue.o?.o为undefined)
     * @param map
     */
    static obj2TextValueArray(map: any): TextValue[];
    /**
     * @deprecated 推荐用objArray2KvOptsRecursive
     * 把JSON对象数组转换为TextValue数组，支持嵌套和携带额外的数据（最多两级，且允许原始数组第二级的键值对名称和第一级的名称不同）
     * 注意事项：如果没有第二级，通常情况下可以忽略后面的三个参数（如果出现字段冲突，可以指定subArrayName参数为obj数组元素对象中不存在的字段名称）
     * @param obj           传入的Json对象
     * @param k1Name        第一级的key名称（默认为key）
     * @param v1Name        第一级的value名称（默认为value）
     * @param subArrayName  第二级数组的的名称 （默认为list）
     * @param k2Name        第二级的key名称（默认为key）
     * @param v2Name        第二级的value名称（默认为value）
     */
    static objArray2TextValueArray(obj: any[], k1Name?: string, v1Name?: string, subArrayName?: string, k2Name?: string, v2Name?: string): TextValue[];
    /**
     * 把JSON对象数组转换为目标键值对数组，支持嵌套和携带额外的数据（不限层级，推荐，要求原始数组任意层级的键值对名称保持一致）
     * @param kvOpts 传入的Json对象
     * @param k 原key名称（默认value）
     * @param targetK 目标key名称（默认value）
     * @param v 原value名称（默认label）
     * @param targetV 目标value名称（默认text）
     * @param children 原子级名称（默认children）
     * @param targetChildren 目标子级名称（默认children）
     */
    static objArray2KvOptsRecursive(kvOpts: any[], k?: string, targetK?: string, v?: string, targetV?: string, children?: string, targetChildren?: string): any[];
    /**
     * 根据key获取value，如果没有找到指定的键，则返回空字符串''。
     * @param key 键
     * @param arr TextValue[]
     */
    static k2vTextValue(key: string, arr: TextValue[]): string;
    /**
     * 根据key获取TextValue对象，如果没有找到指定的键，则返回null
     * @param key 键
     * @param arr TextValue[]
     */
    static k2TextValue<T = TextValue>(key: string, arr: T[]): T | undefined;
    /**
     * 根据value获取key，只有唯一匹配时才返回，否则返回null
     * @param v   键值对中的值
     * @param arr TextValue[]
     */
    static v2kTextValue(v: string, arr: TextValue[]): any;
    /**
     * 根据keys数组获取values数组（options不限层级）
     * @param options 键值对数组
     * @param keys 键数组
     * @param kName 键名称（默认value）
     * @param vName 值名称（默认text）
     * @param childrenName 子级名称（默认children）
     */
    static getTextsByKeys(options: any[], keys: any[], kName?: string, vName?: string, childrenName?: string): any[];
    /**
     * 根据keys数组获取items数组（options不限层级）
     * @param options 键值对数组
     * @param keys 键数组
     * @param kName 键名称（默认value）
     * @param vName 值名称（默认text）
     * @param childrenName 子级名称（默认children）
     */
    static getItemsByKeys(options: any[], keys: any[], kName?: string, vName?: string, childrenName?: string): any[];
    /**
     * 根据keys数组获取values数组（options不限层级）
     * @param options 键值对数组
     * @param keys 键数组
     * @param needItems 是否需要Items（默认false，即返回values）
     * @param kName 键名称（默认value）
     * @param vName 值名称（默认text）
     * @param childrenName 子级名称（默认children）
     */
    private static getValuesOrItemsByKeys;
    /****************************** TextValue End*******************************************/
    /****************************** SVInfo Start********************************************/
    /**
     * 把map字典对象转换为SVInfo数组(svInfo.o?.o为undefined)
     * @param map
     */
    static obj2SvInfoArray(map: any): SVInfo[];
    /**
     * 把JSON对象数组转换为SVInfo数组，支持嵌套（最多两级）
     * 注意事项：如果没有第二级，通常情况下可以忽略后面的三个参数（如果出现字段冲突，可以指定subArrayName参数为obj数组元素对象中不存在的字段名称）
     * @param obj           传入的Json对象
     * @param k1Name        第一级的key名称（默认为key）
     * @param v1Name        第一级的value名称（默认为value）
     * @param subArrayName  第二级数组的的名称 （默认为list）
     * @param k2Name        第二级的key名称（默认为key）
     * @param v2Name        第二级的value名称（默认为value）
     */
    static objArray2SvInfoArray(obj: any[], k1Name?: string, v1Name?: string, subArrayName?: string, k2Name?: string, v2Name?: string): SVInfo[];
    /**
     * 根据key获取value，如果没有找到指定的键，则返回空字符串''。
     * @param key 键
     * @param arr SVInfo[]
     */
    static k2vSVInfo(key: string, arr: SVInfo[]): any;
    /**
     * 根据key获取SVInfo对象，如果没有找到指定的键，则返回null
     * @param key 键
     * @param arr SVInfo[]
     */
    static k2SVInfo(key: string, arr: SVInfo[]): SVInfo<any> | undefined;
    /**
     * 根据value获取key，只有唯一匹配时才返回，否则返回null
     * @param v   键值对中的值
     * @param arr SVInfo[]
     */
    static v2kSVInfo(v: string, arr: SVInfo[]): string | null;
    /****************************** SVInfo End********************************************/
    /**
     * 置顶键值对数组中的某个元素
     * @param kvOpts 键值对数组
     * @param topUpKey 待置顶元素的key
     * @param kName 键的名称
     */
    static topUpKvOpts(kvOpts: any[], topUpKey: any, kName?: string): any[];
    /****************************** Others ********************************************/
    /**
     * 连接的字符串切割成数组并返回（调用StringUtil类中的同名方法）
     * @param jointStr 连接的字符串
     * @param separator 连接符
     */
    static jointStr2Arr(jointStr?: string, separator?: string): string[];
}

/**
 * 当前运行的设备平台类型枚举(注意：微信浏览器需要单独调用isPlatformWeiXinBrowser方法判断)
 */
declare enum PlatformType {
    IOS_TYPE = 1,
    ANDROID_TYPE = 2,
    OTHER_TYPE = 3,
    WeiXinBrowser_TYPE = 4
}
/**
 * 其它工具类
 */
declare class OtherUtil {
    /**
     * 防抖：短时间内多次触发，只在最后一次触发后调用
     * 【注意】：最后一次触发后不是立即调用，而是延迟指定的时间后调用；
     * 【原理】：利用高阶函数延迟函数内局部变量的生命周期，短时间内多次触发取消上一次的定时任务，并重新设置新的定时任务。
     * 【应用场景】：如搜索框自动提示，以最新的关键词为准，连续触发时最后一次超过时间间隔的触发才调搜索接口。
     * @param fn 需要进行防抖的函数
     * @param timeSecond 毫秒值，默认300
     * @param defaultSymbolId 全局唯一的Symbol标识符，一般情况下采用默认值即可
     */
    static debounce(fn: () => void, timeSecond?: number, defaultSymbolId?: string): () => void;
    /**
     * 节流：短时间内多次触发，只在第一次触发时立即调用
     * 【注意】：节流的目的是控制流速，距离上一次有效触发的间隔超过指定的时间才有效；实际应用中第一次触发会立即执行。
     * 【原理】：利用高阶函数延迟函数内局部变量的生命周期，短时间内多次触发计算距离上一次有效触发的时间间隔，超过时才会执行。
     * 【应用场景】：如防止表单重复提交，连续多次点击，只在第一次点击时提交。
     * @param fn 需要进行节流的函数
     * @param timeSecond 毫秒值，默认300
     * @param defaultSymbolId 全局唯一的Symbol标识符，一般情况下采用默认值即可
     */
    static throttle(fn: () => void, timeSecond?: number, defaultSymbolId?: string): () => void;
    /**
     * 打印Vue2组件的data数据
     * @param _this 组件实例
     * @returns void
     */
    static logThisData(_this: any): void;
    /**
     * 深拷贝给定的对象
     * @param obj 任意类型的对象
     * @returns 类型一致的不同对象
     */
    static deepCopy<T = any>(obj: T): T;
    /**
     * 删除对象上的指定属性
     * @param obj object类型
     * @param attributes 属性名称数组
     * @param notDeep 是否非深层次删除，默认false
     */
    static deleteAttributes(obj: any, attributes?: string[], notDeep?: boolean): void;
    /**
     * 瘦身API接口返回的数据结构
     * @param obj 任意类型
     * @param n 字符串类型截取前n个字符，默认前30
     *
     // 【第一步：打开console控制台，复制一下代码粘贴后回车】
     var TestClass = (function () {
     function TestClass() {
     }
     TestClass.slimApiData = function (obj, n) {
     var _a;
     if (n === void 0) { n = 30; }
     // debugger
     try {
     if (Array.isArray(obj)) { // 数组类型
     for (var i = 0; i < obj.length; i++) {
     obj[i] = this.slimApiData(obj[i], n);
     }
     }
     else if (typeof obj === 'object' && obj != null) { // 对象类型，且不为null
     // tslint:disable-next-line:forin
     for (var p in obj) {
     if (obj.hasOwnProperty(p)) {
     obj[p] = this.slimApiData(obj[p], n);
     }
     }
     }
     else if (typeof obj === 'string') {
     if (((_a = obj) === null || _a === void 0 ? void 0 : _a.length) > n) { // 字符串类型长度超过N则截取前n个字符
     return obj.substring(0, n);
     }
     }
     }
     catch (e) {
     console.warn(e);
     }
     return obj;
     };
     TestClass.deepCopy = function (obj) {
     var res = obj;
     if (Array.isArray(obj)) { // 数组类型
     res = [];
     for (var i = 0; i < obj.length; i++) {
     res.push(this.deepCopy(obj[i]));
     }
     }
     else if (typeof obj === 'object' && obj != null) { // 对象类型，且不为null
     // const type = ["string", "boolean", "number", "bigint", "undefined", "object", "function", "symbol"];
     res = {};
     for (var p in obj) {
     res[p] = this.deepCopy(obj[p]);
     }
     }
     else { // 其它类型
     return res;
     }
     return res;
     };
     TestClass.deleteAttributes = function (obj, attributes, deep) {
     if (attributes === void 0) { attributes = []; }
     try {
     if (deep) {
     if (Array.isArray(obj)) { // 数组类型
     for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) {
     var item = obj_1[_i];
     this.deleteAttributes(item, attributes, deep);
     }
     }
     else if (typeof obj === 'object' && obj != null) { // 对象类型，且不为null
     // tslint:disable-next-line:forin
     for (var p in obj) {
     if (obj.hasOwnProperty(p)) {
     if ((attributes === null || attributes === void 0 ? void 0 : attributes.indexOf(p)) > -1) {
     delete obj[p];
     }
     else {
     this.deleteAttributes(obj[p], attributes, deep);
     }
     }
     this.deleteAttributes(obj[p], attributes, deep);
     }
     }
     }
     else {
     if (typeof obj === 'object' && obj != null) { // 对象类型，且不为null
     for (var p in obj) {
     if (obj.hasOwnProperty(p) && (attributes === null || attributes === void 0 ? void 0 : attributes.indexOf(p)) > -1) {
     delete obj[p];
     }
     }
     }
     }
     }
     catch (e) {
     console.warn(e);
     }
     };
     return TestClass;
     }());

     // 【第二步：复制一下代码粘贴后把api替换成接口返回的完整数据实例后回车，得到瘦身后的字符串，再放在bejson.com中格式化，最后建模】
     var api = {
     a: 'abcdefgh',
     b: 'BB',
     c: { c1: 'c1V', c2: 'c2Vabcdefgh', c3: ['0-1234567', { 'c3-001': 'abcdefg', 'c3-002': 122342342 }] }
     };
     console.log(JSON.stringify(TestClass.deepCopy(api)));
     var slimApi = TestClass.slimApiData(api, 30);
     TestClass.deleteAttributes(slimApi, ['tableName', 'attributeNames'], true);
     console.log(JSON.stringify(slimApi));
     */
    static slimApiData(obj: any, n?: number): any;
    /**
     * 半自动化生成API接口数据类型定义
     * @param api object对象
     * @param templateApi 默认值{}
     * @param subInterfaceArr 子接口定义字符串数组
     * @param seperator 替换标志性字符，默认@（操作后替换'@和@'为空字符串即可）
     【操作方式】把编译后的js脚本放在下面任意一个网站上执行，注意其中的api变量的值用接口返回的object类型对象替换。
     在线执行js网站1：https://www.bejson.com/runcode/javascript/
     在线执行js网站2：https://tool.lu/coderunner/

     var TestClass = (function () {
     function TestClass() {
     }
     TestClass.generateApiInterface = function (api, templateApi, subInterfaceArr, seperator) {
     if (templateApi === void 0) { templateApi = {}; }
     if (subInterfaceArr === void 0) { subInterfaceArr = []; }
     if (seperator === void 0) { seperator = '@'; }
     var innerFunc = function (innerApi, innerTemplateApi, innerArr, innerSeperator) {
     if (innerTemplateApi === void 0) { innerTemplateApi = {}; }
     if (innerArr === void 0) { innerArr = []; }
     if (innerSeperator === void 0) { innerSeperator = '@'; }
     if (!innerApi) {
     return;
     }
     if (typeof innerApi === "object") {
     for (var k in innerApi) {
     if (innerApi.hasOwnProperty(k)) {
     var v = innerApi[k];
     if (typeof v === 'string') {
     innerTemplateApi[k] = innerSeperator + "string; // \"" + v + "\"" + innerSeperator;
     }
     else if (typeof v === 'number') {
     innerTemplateApi[k] = innerSeperator + "number; // " + v + innerSeperator;
     }
     else if (typeof v === 'boolean') {
     innerTemplateApi[k] = innerSeperator + "boolean; // " + v + innerSeperator;
     }
     else if (!v) {
     innerTemplateApi[k] = innerSeperator + "any; // " + v + innerSeperator;
     }
     else if (Array.isArray(v)) {
     if (v.length === 0) {
     innerTemplateApi[k] = innerSeperator + "any[]" + innerSeperator;
     }
     else {
     var item = v[0];
     if (typeof item === 'string') {
     innerTemplateApi[k] = innerSeperator + "string[]; // [" + v + "]" + innerSeperator;
     }
     else if (typeof item === 'number') {
     innerTemplateApi[k] = innerSeperator + "number[]; // [" + v + "]" + innerSeperator;
     }
     else if (typeof item === 'boolean') {
     innerTemplateApi[k] = innerSeperator + "boolean[]; // [" + v + "]" + innerSeperator;
     }
     else if (!item) {
     innerTemplateApi[k] = innerSeperator + "any[]; // [" + v + "]" + innerSeperator;
     }
     }
     }
     else if (typeof v === 'object') {
     var interfaceName = 'I' + k.charAt(0).toUpperCase() + k.substring(1);
     // console.log(`export interface ${interfaceName} {}`);
     innerArr.push("export interface " + interfaceName + " {}");
     innerTemplateApi[k] = innerFunc(v, innerTemplateApi[k], innerArr, innerSeperator);
     }
     }
     }
     }
     else {
     console.error('必须传入object类型');
     }
     return innerTemplateApi;
     };
     var result = innerFunc(api, templateApi, subInterfaceArr, seperator);
     if (!result)
     return { templateApi: null, subInterfaceArrStr: '' };
     return {
     templateApi: result,
     subInterfaceArrStr: subInterfaceArr.join('\n')
     };
     };
     return TestClass;
     }());

     (function () {
     var api = {
     "name": "张三",
     "id": '001',
     "other": null,
     "width": 199,
     "isHappy": true,
     "hobbies": ["打球", "下棋"],
     "pInfo": {
     "hobbies": ["打球", "下棋"],
     "processResult": {
     "processA": "value-processA",
     "height": 200,
     "isNew": false
     }
     }
     };
     var apiInterface = TestClass.generateApiInterface(api);
     console.log('\n' + apiInterface.subInterfaceArrStr + '\n');
     console.log(apiInterface.templateApi);
     })();

     */
    static generateApiInterface(api: any, templateApi?: any, subInterfaceArr?: string[], seperator?: string): {
        templateApi: any;
        subInterfaceArrStr: string;
    };
    /**
     * 去掉json字符串对象中所有key的双引号
     * @param jsonStr
     */
    static unquoteKeys(jsonStr: string): string;
    /**
     * 获取传入数据的自定义js类型
     * @param data 任意类型数据
     * @returns 自定义的js类型（自定义对象也是返回"object"）
     */
    static getJsType(data: any): "string" | "number" | "boolean" | "object" | "array" | "function" | "date" | "regexp" | "undefined" | "null" | "symbol";
    /**
     * 判断给定的参数是否是数组且元素个数不为0
     * @param arr 给定的数组
     * @returns boolean
     */
    static isArrayHasLength(arr: any[]): boolean;
    /**
     * 判断当前运行系统的类型(iOS/Android/其它类型)
     * @returns
     */
    static getSystemPlatformType(): PlatformType;
    /**
     * 判断当前运行系统是否是微信浏览器
     * @returns
     */
    static isPlatformWeiXinBrowser(): boolean;
    /**
     * 金额自动校正（在输入框的keyup事件中把返回结果赋值给输入框绑定的model上即可显著提升用户输入体验）
     * @param value             字符串类型
     * @param maxLengthAfterDot 小数点后最多允许多少位
     * @return 过滤后的字符串
     */
    static filterMoney(value: any, maxLengthAfterDot: number): string;
    /**
     * 深层次把可能的响应式对象转换为普通对象
     * @param obj 响应式对象或普通对象
     * @param toRawFn 必须传入vue3中的toRaw函数引用，否则结果返回原对象
     */
    static deepToRaw(obj: any, toRawFn?: (param: any) => any): any;
}

declare type Mergeable = Record<string, any> | any[];
/**
 * 数据转换工具类
 */
declare class DataConverterUtil {
    /**
     * 按需转换Json字符串为Json对象
     * @param input
     */
    static convert2ObjIfNeed(input: any): any;
    /**
     * 参数对象转换为url参数方式
     * @param params
     * @return
     */
    static convert2UrlParams(params: any): string;
    /**
     * 从url中获取问号后面的参数
     * @param url url地址（如：?p1=v1&p2=）
     * @param key 可选，当指定了key时则返回该key对应的value；当key不存在时返回undefined
     */
    static getParamFromUrl(url?: string, key?: string): any;
    /**
     * 连接的字符串切割成数组并返回（调用StringUtil类中的同名方法）
     * @param jointStr 连接的字符串
     * @param separator 连接符
     */
    static jointStr2Arr(jointStr?: string, separator?: string): string[];
    /**
     * 转换数字或字符串为指定小数位数的百分比形式%（如果为0则返回0，如果非数字则原样返回）
     * @param data
     * @param dotBits
     * @returns
     */
    static format2Percent(data: any, dotBits?: number): any;
    /**
     * 转换百分比字符串为指定小数位数的数字
     * @param data 任意类型
     * @param dotBits 四舍五入保留的小数点后位数，默认2
     */
    static formatPercent2Decimal(data: any, dotBits?: number): number;
    /**
     * 货币格式化，如'10000' -> '10,000' 或 '10,000$' 或'10,000￥'
     * @param numberStr 数字或数字字符串
     * @param defaultUnit 末尾的货币单位，默认无
     * @returns 字符串，当为null或undefined时，返回空字符串''
     */
    static format2Currency(numberStr: string | number | null | undefined, defaultUnit?: string): string;
    /**
     * 深度合并函数（把b的值合并到a上并返回合并后的值，不改变原始a和b的值）
     * @param a Mergeable
     * @param b Mergeable
     */
    static deepMergeWithDedupe<T extends Mergeable>(a: T, b: T): T;
    /******************************** 私有方法 ********************************/
    private static isPlainObject;
    private static isSameTypeElement;
    private static deduplicateArray;
    private static deepClone;
    private static findIndex;
}

/**
 * 日期工具类
 */
declare class DateUtil {
    /**
     * 日期格式化
     * @param date 待格式化的日期对象、日期时间戳、日期字符串（月份和日期可以为2位，也可以为1位）
     * @param sFormat 输出格式,默认为yyyy-MM-dd                          年：y，月：M，日：d，时：h，分：m，秒：s
     * @example  dateFormat(new Date())                               "2017-02-28"
     * @example  dateFormat(new Date(),'yyyy-MM-dd')                  "2017-02-28"
     * @example  dateFormat(new Date(),'yyyy-MM-dd HH:mm:ss')         "2017-02-28 13:24:00"   ps:HH:24小时制
     * @example  dateFormat(new Date(),'yyyy-MM-dd hh:mm:ss')         "2017-02-28 01:24:00"   ps:hh:12小时制
     * @example  dateFormat(new Date(),'hh:mm')                       "09:24"
     * @example  dateFormat(new Date(),'yyyy-MM-ddTHH:mm:ss+08:00')   "2017-02-28T13:24:00+08:00"
     * @example  dateFormat(new Date('2017-02-28 13:24:00'),'yyyy-MM-ddTHH:mm:ss+08:00')   "2017-02-28T13:24:00+08:00"
     * @returns {string}
     */
    static dateFormat(date: Date | number | string | undefined, sFormat?: string): string;
    /**
     * 当使用new Date('一定格式的日期字符串')时，必须把传入的日期字符串通过该方法兼容处理一下（返回格式：yyyy/MM/dd 或 yyyy/MM/dd HH:mm:ss）
     * 1.由于ios的new Date()不能直接将除了"yyyy/MM/dd"格式外的字符串转换成Date类型，要先通过此方法来做兼容；
     * 2.ios和部分安卓手机new Date()不能直接将月份或天数为1位的日期字符串转换成Date类型，也需要通过此方法做兼容；
     */
    static compatibleDateOfIos(dateStr: string): string;
    /**
     * 比较日期字符串（如果dateStr1在dateStr2之前返回-1，相等返回0，否则返回1）
     * @param dateStr1 日期字符串1
     * @param dateStr2 日期字符串2
     */
    static compare(dateStr1: string, dateStr2: string): 0 | 1 | -1;
}

/**
 * 文件处理工具类
 */
declare class FileUtil {
    /**
     * base64转为文件File（同步方法，atob）
     * base64Str: base64图片格式字符串(必须有前缀)
     * filename：文件名称（支持带后缀名称和不带后缀名称，当需要保存文件实体到Window系统上时，必须传入文件后缀名称）
     * @returns File对象
     */
    static base64ToFile(base64Str: string, filename?: string, prefixType?: string): File;
    /**
     * 文件File转为base64（同步方法，btoa）
     * file：File对象
     * type：文件类型，默认为'image/png'
     * @returns base64字符串
     */
    static fileToBase64(file: any, type?: string): string;
    /**
     * 文件File转为base64（异步方法，readAsDataURL）
     * file：File对象
     * @returns Promise<base64字符串>
     */
    static fileToBase64Async(file: any): Promise<string>;
    /**
     * base64转换为文件流Blob（同步方法，atob）
     * @param base64Str base64图片格式字符串(自动前缀)
     * @param mime 指定前缀类型（优先取base64Str中的前缀类型，当没有前缀时取传入的mime值，mime默认值为image/png）
     * @returns Blob
     * @link mime常见类型值：https://blog.csdn.net/qq_45043000/article/details/128309064
     */
    static base64ToBlob(base64Str: string, mime?: string): Blob;
    /**
     * 文件流Blob转换成base64
     * @param file Blob文件
     * @param fileSuffixName 文件后缀名，如'.png'
     */
    static blob2Base64(file: Blob, fileSuffixName?: string): Observable<string>;
    /**
     * 任意格式的base64图片转换成任意格式的base64图片（异步）
     * @param base64Str 源图片编码（前缀）
     * @param targetType 目标转换类型，默认png格式
     */
    static anyPicBase64ToAnyPicBase64(base64Str: string, targetType?: string): Promise<string>;
    /**
     * 批量转换Blob数组为base64数组
     * @param files Blob文件数组
     * @param fileSuffixNames 文件后缀名数组，如['.png']
     */
    static blob2Base64s(files: Blob[], fileSuffixNames?: string[]): Observable<string[]>;
    /**
     * 把File转换成UTF8字符串
     * @param file File对象
     */
    static file2Utf8Str(file: File): Observable<string>;
    /**
     * base64字符编码添加协议前缀（如果存在则原样返回）
     * @param base64Origin base64字符串
     * @param base64Prefix base64协议前缀（默认为'data:image/png;base64,'）
     * @returns
     */
    static base64PrefixAdd(base64Origin: string, base64Prefix?: string): string;
    /**
     * 检测按需添加base64字符串编码的png协议前缀
     * @param base64Origin base64字符串编码
     * @returns 带指定协议前缀的base64编码字符串
     */
    static base64PrefixAddPng(base64Origin: string): string;
    /**
     * 检测按需添加base64字符串编码的svg协议前缀
     * @param base64Origin base64字符串编码
     * @returns 带指定协议前缀的base64编码字符串
     */
    static base64PrefixAddSvg(base64Origin: string): string;
    /**
     * base64字符编码去掉协议前缀（如果不存在则原样返回）
     * @param base64Full base64字符串
     * @returns
     */
    static base64PrefixRemove(base64Full: string): string;
    /**
     * 获取base64字符串的前缀，若不存在返回''
     * @param base64Str base64格式字符串(自动前缀)
     */
    static base64Prefix(base64Str: string): string;
    /**
     * 获取base64字符串的MimeType值，若不存在返回''
     * @param base64Str base64格式字符串(自动前缀)
     */
    static base64MimeType(base64Str: string): string;
    /**
     * 下载文件（浏览器环境中通过XMLHttpRequest及<a>标签下载blob url）
     * @param blobUrl
     * @param fileType 文件类型，如”pdf“
     * @param filename 文件名称，如”file.pdf“
     * @returns void
     */
    static downLoadFileWithBlobUrl(blobUrl: string, fileType?: string, filename?: string): void;
    /**
     * 压缩图片（本方法使用纯js的Canvas实现，有兼容性问题，推荐使用第三方插件 compressorjs 或 js-image-compressor实现）
     * @param file 文件对象File或文件流Blob
     * @param quality 压缩质量（0-1之间，越大越清晰，占用内存越大）
     * @param targetType 压缩后的目标图片类型（默认image/png）
     */
    static compressImg(file: File | Blob, quality?: number, targetType?: string): Promise<File | Blob>;
    /**
     * 把二进制字符串转换成Blob类型
     * @param uBytes 二进制字符串
     * @param contentType 文件类型
     */
    static uBytes2Blob(uBytes: string, contentType?: string): Blob;
    /**
     * 把字符串转成Unicode编码字符串
     * @param str 字符串
     */
    static encodeStr2Hex(str: string): string;
    /**
     * 把Unicode编码字符串解码成字符串
     * @param str Unicode编码字符串
     */
    static decodeHex2Str(str: string): string;
}

/**
 * 证件相关的工具类
 */
declare class IdCardUtil {
    /**
     * 判断是否是身份证号码（准确，包含18位和15位身份证号码）
     * @param cardNo 传入的证件号码
     * @param b birthday
     * @param g gender
     */
    static isIDCard(cardNo: string, b?: string, g?: string | number): boolean;
    /**
     * 判断是否是18位身份证号码（不准确）
     * @param cardNo 传入的证件号码
     */
    static isIdCard18(cardNo: string): boolean;
    /**
     * 根据身份证号码（18位或15位）返回性别
     * @param cardNo 传入的证件号码
     * @return 1: 男，2：女，0：未知
     */
    static getSexByIdCard(cardNo: string): number;
    /**
     * 根据身份证号码（18位或15位）返回出生日期
     * @param cardNo
     * @return yyyy-MM-dd
     */
    static getBirthdayByIdCard(cardNo: string): string;
    /**
     * 省市区截取（准确率比较高）
     * @param address 地址字符串
     */
    static getArea(address: string): {
        Province?: string;
        City?: string;
        Country?: string;
    };
}

/**
 * 随机操作工具类
 */
declare class RandomUtil {
    /**
     * 随机从数组中选取一个元素
     * @param arr 待选数组
     */
    static randomChoose(arr: any[]): any;
    /**
     * 随机从数组中选取多个元素（1≤n≤length），可以指定选出的元素个数
     * @param arr     待选数组
     * @param count   可选，选出的元素个数
     * @return        默认以数组的形式返回；当传入的参数arr不合法时返回null。
     */
    static randomChooseBatches(arr: any[], count?: number): any[] | null;
    /**
     * 随机生成指定区间的整数
     * @param a 区间一端a（不要求a<b）
     * @param b 区间另一端b
     */
    static randomInt(a: number, b: number): number;
    /**
     * 生成随机色
     * @param isHex 是否返回十六进制
     * @return 字符串 rgba(0~255,0~255,0~255) 或 #XXXXXX
     */
    static randomColor(isHex?: boolean): string;
    /**
     * 随机生成指定类型的数据（手机号，中文人名，银行卡号等）
     * @param type 特定的类型如下：
     *             'MOBILE_PHONE'：手机号码
     *             'ID_CARD'     ：身份证号码
     *             'PERSON_NAME' ：人名（中文）
     *             'BANK_CARD_NO'：银行卡号
     */
    static randomCreate(type: ('MOBILE_PHONE' | 'ID_CARD' | 'PERSON_NAME' | 'BANK_CARD_NO')): string;
    /**
     * 随机生成手机号码
     * @private
     */
    private static randomCreateMobilePhone;
    /**
     * 随机生成身份证号码
     * ps: 前缀（住址+生日）采用固定的值
     * @private
     */
    private static randomCreateIdCard;
    /**
     * 随机生成中文人名
     * @private
     */
    private static randomCreatePersonName;
    /**
     * 随机生成银行卡号
     * @param bankTypeId （可选参数）银行类型编号
     * @private
     */
    private static randomCreateBankCardNo;
    /**
     * 模拟分页数据（同步方式，如果需要模拟网络延迟可在外部进行异步调用）
     * @param createItemFn （可选）创建单条数据的函数或所有记录数组（其中函数参数index为对应item在总记录数中的序列号，从1开始；当为数组类型时，totalCount被自动设置为数组长度）
     * @param pageNo 当前请求的页号，默认1（当传入非法数据时返回空数组）
     * @param pageSize 每页数据条数，默认10
     * @param totalCount 模拟数据库中存在的总记录条数，默认52
     * @return ({ pageNo: number, pageSize: number, totalCount: number, pageCount: number, resultList: T[] })
     */
    static randomPageData<T = any>(createItemFn?: ((index: number) => T) | T[] | null | undefined, pageNo?: number, pageSize?: number, totalCount?: number): ({
        pageNo: number;
        pageSize: number;
        totalCount: number;
        pageCount: number;
        resultList: T[];
    });
}

/**
 * 正则表达式工具类
 */
declare class RegularUtil {
    /**
     * 电子邮件
     */
    static readonly Email: RegExp;
    /**
     * 邮政编码
     */
    static readonly PostCode: RegExp;
    /**
     * 11位手机号码
     */
    static readonly Mobile: RegExp;
    /**
     * 固定电话（区号-电话号，分隔符'-'可有可无）
     */
    static readonly Telephone: RegExp;
    /**
     * base64字符串
     */
    static readonly Base64: RegExp;
}

/**
 * 字符串处理工具类
 */
declare class StringUtil {
    /**
     * 判断字符串是否有长度（非undefined，null，''，可以为数字类型number）
     * @param str 传入的字符串
     */
    static hasLength(str: string | number | undefined | null | unknown): boolean;
    /**
     * 用两个特殊字符串截取原字符串的中间部分，如果不存在则返回空字符串
     * @param origin 原始字符串
     * @param str1 第一个特定的字符串
     * @param str2 第二个特定的字符串
     * @returns 中间部分
     */
    static subStringWith(origin: string, str1: string, str2: string): string;
    /**
     * 是否是数字字符串（非undefined、null、''，可以以0开头，支持带小数点的判断，第二个参数传入true即可）
     * @param str 传入的字符串
     * @param allowPoint 是否允许小数点（默认不允许）
     */
    static isNumberString(str: string, allowPoint?: boolean): boolean;
    /**
     * 连接的字符串切割成数组并返回
     * @param jointStr 连接的字符串
     * @param separator 连接符
     */
    static jointStr2Arr(jointStr?: string, separator?: string): string[];
    /**
     * 去掉字符串中所有的空格（包括字符串中间的空格，如果原字符串没有长度则默认返回空串：''）
     * 原生js：trim()去掉左右空格，trimLeft()/trimRight()、trimStart()/trimEnd()
     * @param str 传入的字符串
     */
    static trimAll(str: string): string;
    /**
     * 字符串脱敏
     * @param str 原始字符串
     * @param start 待脱敏的起始下标（从0开始，含当前位置）
     * @param end 待脱敏的结束下标（从0开始，含当前位置）
     * @param replaceCharacter 替换的字符串，默认为"*"
     */
    static desensitized(str: string | undefined, start: number, end: number, replaceCharacter?: string): string;
    /**
     * 判断文本中是否有表情字符
     * （编译后可能在某些IDE中不生效，把编译后的源码拷贝一份放在项目src中本地使用）
     * @param str 给定的字符串
     */
    static hasEmojiCharacter(str?: string): boolean;
}

/**
 * 校验工具类
 */
declare class ValidatorUtil {
    /**
     * 判断任意类型的参数是否为空（undefined、null、''、'undefined'、'null'、[]、{}）
     * @param param 任意类型
     * @param includes 包括特殊值也视为空，默认为['null', 'undefined']
     */
    static isEmpty(param: any, includes?: any[]): boolean;
    /**
     * 判断传入的对象是否为空对象或没有初始化（null 或 undefined）
     * @param obj 传入的对象
     */
    static isNullOrUndefined(obj: any): boolean;
    /**
     * 判断数组是否为空
     * @param arr
     */
    static isArrayEmpty(arr: any[] | null | undefined): boolean;
    /**
     * 判断传入的字符串是否为11位手机号码
     * @param mobile 传入的手机号码
     */
    static isMobile(mobile: string): boolean;
    /**
     * 判断传入的字符串是否为固定电话（区号-电话号，分隔符'-'可有可无）
     * @param telephone 传入的固定电话号码
     */
    static isTelephone(telephone: string): boolean;
    /**
     * 判断传入的字符串是否为手机号码 或 固定电话
     * @param mobileOrTelephone 传入的号码
     */
    static isMobileOrTelephone(mobileOrTelephone: string): boolean;
    /**
     * 判断传入的字符串是否为邮箱
     * @param email 传入的字符串
     */
    static isEmail(email: string): boolean;
    /**
     * 判断传入的字符串是否为邮政编码
     * @param postCode 传入的字符串
     */
    static isPostCode(postCode: string): boolean;
    /**
     * 判断是否是统一社会信用代码
     * @param unicode 传入的证件号码
     */
    static isSocialUnicode(unicode: string): boolean;
    /**
     * 是否是数字字符串（非undefined、null、''，可以以0开头，支持带小数点的判断，第二个参数传入true即可）
     * @param str 传入的字符串
     * @param allowPoint 是否允许小数点（默认不允许）
     */
    static isNumberString(str: string, allowPoint?: boolean): boolean;
    /**
     * 判断是否是纯汉字
     * @param str 传入的字符串
     */
    static isPureHanZi(str: string): boolean;
    /**
     * 判断axios返回的数据是否是Blob类型（简短粗略地判断res.type是否非json格式数据）
     * @param axiosResponse axios请求返回的原始数据
     * @returns
     */
    static isBlob(axiosResponse: any): boolean;
    /**
     * 判断指定的对象是否有指定的属性且属性有值（可以为0，但是不能为null/undefined）
     * @param obj 传入的对象
     * @param propertyName 属性名称
     * @returns boolean
     */
    static isPropertyHasValue(obj: any, propertyName: string): boolean;
}

/**
 * HTML工具类
 */
declare class HtmlUtil {
    /**
     * 复制文本（支持PC和手机端，依赖clipboard插件，插件提供复制和剪切功能）
     * @param target 被复制的文本内容或元素Element
     * @param callback 回调函数
     * npm install clipboard
     * import * as ClipboardJS from "clipboard";
     */
    static copyTextPcAndMobile(target: string | Element, callback?: (isSuccess: boolean, msg?: string) => void): void;
    /**
     * 复制文本（仅支持PC端，手机端无法使用）
     * @param text 被复制的文本内容
     * @param callback 回调函数
     */
    static copyTextPc(text: string, callback?: (isSuccess: boolean, msg?: string) => void): void;
}

/**
 * 树形结构数据处理工具类
 */
declare class TreeUtil {
    /**
     * 把平行结构的类似"省市区"等结构的数组数据转换成树形结构数组，支持指定层级值属性名称
     * @param parallelList 平行数组
     * @param id 平行数据项的唯一编码字段名称
     * @param parentId 父级数据项的唯一编码字段名称
     * @param children 子级数组字段名称
     * @param level 层级属性字段名称（默认为"level"，当设置成元素同名属性时会忽略，即不覆盖）
     * @param startLevel 层级属性值的起始值（默认从1开始）
     * @param callback 每个结点操作的回调函数
     * @returns {*[]} 树形结构数组
     */
    static toTree(parallelList: any[] | any, id?: string, parentId?: string, children?: string, level?: string, startLevel?: number, callback?: (item: any) => void): any[];
    /**
     * 把树形结构数组转换成平行结构
     * @param tree 树形结构
     * @param children 子级数组字段名称
     * @returns {*|*[]} 平行结构数组
     */
    static toList(tree: any[] | any, children?: string): any[];
    /**
     * 把树形结构转换为平行结构，可传入结点操作的回调函数
     * @param tree 树形结构
     * @param children 子级数组字段名称
     * @param callback 每个结点操作的回调函数
     * @returns {*|*[]} 平行结构数组
     */
    static toListWithCallback(tree: any[] | any, children?: string, callback?: (item: any) => void): any[];
    /**
     * 条件搜索树（"剪枝"过滤后满足完整的树形结构）
     * @param tree 原始树
     * @param id 数据项的唯一编码字段名称
     * @param parentId 父级数据项的唯一编码字段名称
     * @param children 子级数组字段名称
     * @param conditionFn 结点满足搜索条件的函数
     */
    static searchTree(tree: any[] | any, id?: string, parentId?: string, children?: string, conditionFn?: (_: any) => boolean): any[];
    /**
     * 根据id查找结点
     * @param tree 原始树
     * @param idValue 待查找结点的id值
     * @param id 数据项的唯一编码字段名称
     * @param children 子级数组字段名称
     */
    static findNodeById(tree: any[] | any, idValue: any, id?: string, children?: string): any;
    /**
     * 查找指定结点的直接父级结点
     * @param tree 原始树
     * @param currentNodeId 指定的结点的id值
     * @param id 数据项的唯一编码字段名称
     * @param parentId 父级数据项的唯一编码字段名称
     * @param children 子级数组字段名称
     */
    static findParentNode(tree: any[] | any, currentNodeId: any, id?: string, parentId?: string, children?: string): any;
}

/**
 * 缓存工具类（localStorage、sessionStorage）
 */
declare class CacheUtil {
    /**
     * 存储基本类型
     * @param key 字符串
     * @param value 基本类型
     */
    static set(key: string, value: any): void;
    /**
     * 获取值（基本类型）
     * @param key 字符串
     */
    static get(key: string): string | null;
    /**
     * 存储对象
     * @param key 字符串
     * @param jsonValue object类型
     */
    static setJSON(key: string, jsonValue: object): void;
    /**
     * 获取对象
     * @param key 字符串
     */
    static getJSON(key: string): any;
    /**
     * 删除
     * @param key
     */
    static remove(key: string): void;
    static setSession(key: string, value: any): void;
    static getSession(key: string): string | null;
    static setJSONSession(key: string, jsonValue: object): void;
    static getJSONSession(key: string): any;
    static removeSession(key: string): void;
}

/**
 * 缓存工具类（支持过期时间，惰性自动删除）
 */
declare class CacheTtlUtil {
}

/**
 * 自定义工具类
 * e.g: （1）在.ts文件中直接使用即可，
 *      （2）在.html文件中使用需要在对应的.ts文件中引入同名（推荐）的实例变量，类型为：typeof CustomUtil。
 *          如：CustomUtil: typeof CustomUtil = CustomUtil; 然后在.html文件中：<div>{{CustomUtil.DateUtil.xxx}}</div>
 */
declare class CustomUtil {
    static readonly DateUtil: typeof DateUtil;
    static readonly StringUtil: typeof StringUtil;
    static readonly DictUtil: typeof DictUtil;
    static readonly ValidatorUtil: typeof ValidatorUtil;
    static readonly RegularUtil: typeof RegularUtil;
    static readonly RandomUtil: typeof RandomUtil;
    static readonly IdCardUtil: typeof IdCardUtil;
    static readonly FileUtil: typeof FileUtil;
    static readonly DataConverterUtil: typeof DataConverterUtil;
    static readonly HtmlUtil: typeof HtmlUtil;
    static readonly TreeUtil: typeof TreeUtil;
    static readonly CacheUtil: typeof CacheUtil;
    static readonly CacheTtlUtil: typeof CacheTtlUtil;
    static readonly OtherUtil: typeof OtherUtil;
    constructor();
}

export { CacheTtlUtil, CacheUtil, CustomUtil, DataConverterUtil, DateUtil, DictUtil, FileUtil, HtmlUtil, IdCardUtil, KVInfo, Mergeable, OtherUtil, PlatformType, RandomUtil, RegularUtil, SVInfo, StringUtil, TextValue, ValidatorUtil };
