UNPKG

sm-tool

Version:

sm-tool工具包

1,367 lines (1,345 loc) 57 kB
import { IStringifyOptions, BooleanOptional, IParseOptions } from 'qs'; import Compressor from 'compressorjs'; 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; children?: T[]; o?: T; }; } /** * 字典工具类 */ declare class DictUtil { /****************************** TextValue Start *****************************************/ /** * 把obj字典对象转换为TextValue数组(textValue.o?.o为undefined) * @param map * @param kName 键名称(默认value) * @param vName 值名称(默认text) * @returns T[] */ static obj2ItemArray<T = TextValue>(map: any, kName?: string, vName?: string): T[]; /** * @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 T[] * @param kName 键名称(默认value) * @param vName 值名称(默认text) */ static k2v<T = TextValue>(key: string, arr: T[], kName?: string, vName?: string): any; /** * 根据key获取TextValue对象,如果没有找到指定的键,则返回null * @param key 键 * @param arr T[] * @param kName 键名称(默认value) */ static k2Item<T = TextValue>(key: string, arr: T[], kName?: string): T | undefined; /** * 根据value获取key,只有唯一匹配时才返回,否则返回null * @param v 键值对中的值 * @param arr T[] * @param kName 键名称(默认value) * @param vName 值名称(默认text) */ static v2k<T = TextValue>(v: string, arr: T[], kName?: string, vName?: string): any; /** * 根据keys数组获取values数组(options不限层级) * @param options 键值对数组 * @param keys 键数组 * @param kName 键名称(默认value) * @param vName 值名称(默认text) * @param childrenName 子级名称(默认children) * @returns 返回值名称数组 */ 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[]; /** * 多个key的字典翻译,返回英文逗号连接的多个翻译值(调用DictUtil类中的getTextsByKeys方法) * @param opts 字典数组 * @param keys 多个key的数组或字符串(逗号分隔) * @param kName 字典键的属性名称(默认value) * @param vName 字典翻译值的属性名称(默认label) * @param childrenName 子级数组的属性名称(默认children) * @param cnJoinCharacter 翻译连接符(默认中文逗号",") */ static keys2Values(opts: any[], keys?: any[] | string, kName?: string, vName?: string, childrenName?: string, cnJoinCharacter?: string): string; /** * 根据keys数组获取values数组或items数组(options不限层级) * @param options 键值对数组 * @param keys 键数组 * @param needItems 是否需要Items(默认false,即返回values) * @param kName 键名称(默认value) * @param vName 值名称(默认text) * @param childrenName 子级名称(默认children) */ private static getValuesOrItemsByKeys; /** * 增强标准字典数组元素的属性(按需将元素的label属性值拷贝到text属性上以适配Vant字典) * @param standardArr */ static strengthenDictArr<T = any>(standardArr: T[]): T[]; /****************************** 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; /** * 返回qs.stringfy方法的调用结果(可把对象转化为x-www-form-urlencoded的参数格式) * @param obj any类型 * @param options 可选的配置参数 */ static qsStringfy(obj: any, options?: IStringifyOptions<BooleanOptional>): string; /** * 返回qs.parse方法的调用结果(可解析x-www-form-urlencoded格式的参数字符串为对象) * @param str url中的查询字符串或Record对象 * @param options 可选的配置参数 */ static qsParse(str: string | Record<string, string>, options?: IParseOptions<BooleanOptional>): any; /** * 参数对象转换为url参数方式(推荐用DataConverterUtil.qsStringfy方法) * @param params * @return */ static convert2UrlParams(params: any): string; /** * 从url中获取问号后面的参数(获取多个参数时推荐用DataConverterUtil.qsParse方法) * @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; /** * 修改对象的属性为复合属性或其它属性(如把对象的a属性改为"c.d"作为属性,属性值不变) * @param obj 对象类型 * @param keysMap 复合属性键值对 * @param deleteOrigin 是否删除原属性(默认true) * @example const param = {a: "A", b: "B"}; compositeAttributes(param, {a: 'c.d'}); // 执行后param变为=>{"c.d": "A", b: "B"} * @example const param = {a: "A", b: "B"}; compositeAttributes(param, {a: 'e'}); // 执行后param变为=>{"e": "A", b: "B"} */ static modifyAttributes<T = any>(obj?: T, keysMap?: Partial<Record<keyof T, string>>, deleteOrigin?: boolean): any; /******************************** 私有方法 ********************************/ private static isPlainObject; private static isSameTypeElement; private static deduplicateArray; private static deepClone; private static findIndex; } /** * 数据转换工具类 */ declare class EncryptUtil { /** * AES4.2.0加密(兼容Java版AES+ECB+PKCS5Padding) * @param data 待加密字符串(UTF-8编码字符串) * @param key 密钥(16字节,UTF-8编码字符串,且必须和后端保持一致) * @param useDefaultConfig 是否采用默认的Padding(默认true,即"ECB+Pkcs7",否则"CBC+ZeroPadding+iv") * @returns Base64编码的加密结果 */ static encryptAes(data: string, key?: string, useDefaultConfig?: boolean): string; /** * AES4.2.0解密(兼容Java版AES+ECB+PKCS5Padding) * @param encryptedData Base64 编码的加密字符串 * @param key 密钥(16字节,UTF-8编码字符串,且必须和后端保持一致) * @param useDefaultConfig 是否采用默认的Padding(默认true,即"ECB+Pkcs7",否则"CBC+ZeroPadding+iv") * @returns 解密后的原始字符串(UTF-8) */ static decryptAes(encryptedData: string, key?: string, useDefaultConfig?: boolean): string; /** * 把字符串转换为base64字符串 * @param dataStr */ static encryptBase64(dataStr: string): string; /** * 还原base64字符串为原始字符串 * @param base64Str base64编码的字符串 */ static decryptBase64(base64Str: string): string; /** * MD5加密 * @param dataStr 原始字符串 * @param salt 加盐(可选,默认无) */ static encryptMd5(dataStr: string, salt?: string): string; } /** * 日期工具类 */ 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; /** * 获取当前时间字符串('yyyy-MM-dd HH:mm:ss') */ static getNowTimeStr(): string; /** * 截取日期字符串的前10位即日期部分 * @param datetimeStr 日期时间字符串 * @example "yyyy-MM-dd HH:mm:ss" -> "yyyy-MM-dd" * @example "yyyy-MM-dd" -> "yyyy-MM-dd" */ static subStringDateTime10(datetimeStr?: string): string; /** * 在日期字符串末尾按需添加上时分秒 * @param dateStr 当长度不为10时,原样返回 * @example "yyyy-MM-dd" -> "yyyy-MM-dd 00:00:00" * @example "yyyy-MM-dd HH:mm:ss" -> "yyyy-MM-dd HH:mm:ss" */ static autoAppendDateHms(dateStr?: string): string; /** * 在英文逗号连接的日期范围字符串末尾按需添加上时分秒 * @param dateRange 英文逗号连接的多个日期字符串 * @example "yyyy-MM-dd,yyyy-MM-dd" -> "yyyy-MM-dd 00:00:00,yyyy-MM-dd 00:00:00" * @example "yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss" -> "yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss" */ static autoAppendDateHmsRange(dateRange?: string): string; } /** * 文件处理工具类 */ declare class FileUtil { /** * 判断是否是base64字符串(浏览器环境) * @param str 字符串(自动处理前缀) */ static isBase64(str?: string | null): boolean; /** * 将base64转换为文件对象(同步方法,atob) * @param base64String 自动去掉前缀 * @param filename 文件名称(默认'file.png',支持带后缀名称和不带后缀名称,当需要保存文件实体到Window系统上时,必须传入文件后缀名称) * @param fileType 文件类型(自动解析前缀,默认'image/png') * @returns File|null 当无法转换时返回null */ static base64ToFile(base64String: string, filename?: string, fileType?: string): File | null; /** * (不推荐,当参数file为File实例时无法同步转换)文件File转为base64(同步方法,btoa) * file:File对象 * type:文件类型,默认为'image/png' * @returns base64字符串 */ static fileToBase64(file: any, type?: string): string; /** * (推荐)文件File转为base64(异步方法,readAsDataURL)<br>在TypeScript中将File实例转换为Base64没有真正的同步方法,因为文件读取操作本质上是异步的 * 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(返回Promise<string>) * @param file Blob文件 * @param fileSuffixName 文件后缀名,如'.png' * @return Promise<string> */ static blob2Base64Promise(file: Blob, fileSuffixName?: string): Promise<string>; /** * Blob转换成base64(返回Observable<string>) * @param file Blob文件 * @param fileSuffixName 文件后缀名,如'.png' * @return Observable<string> */ 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[]>; /** * (推荐)二进制数据文件流转换成Base64字符串,可用于显示或下载 * @param arrayBuffer 二进制数据文件流 * @param base64Prefix 文件的Base64协议前缀(默认为PDF的Base64协议前缀) */ static arrayBufferToBase64(arrayBuffer: any, base64Prefix?: string): string; /** * (推荐)二进制数据文件流转换成Blob URL,可用于显示或下载(注意:不会自动释放内存,建议在合适的时机通过URL.revokeObjectURL(blobUrl)释放内存) * @param arrayBuffer 二进制数据(如:文件流) * @param type 文件类型(默认"application/pdf"即PDF文件) */ static arrayBufferToBlobUrl(arrayBuffer: any, type?: string): string; /** * (推荐)把File转换成UTF8字符串 * @param file * @return Promise<string | null> */ static file2UTF8Str(file: File): Promise<string | null>; /** * 把File转换成UTF8字符串 * @param file File对象 * @return Observable<string> */ static file2Utf8Str(file: File): Observable<string>; /** * (推荐)压缩图片(使用了兼容性比较好的compressjs库)<br> * 支持指定压缩阈值 或 压缩质量(如:options参数传{quality: 0.6}可让limitSize失效) * @param file 输入图片的数据类型支持File|Blob|base64三种 * @param limitSize 当输入图片超过指定大小字节时才压缩(默认3*1024*1024即3M) * @param resultType 指定输出结果的数据类型(默认base64) * @param options compressjs库支持的压缩参数(优先级最高,当传入quality时会覆盖根据limitSize计算的压缩质量) * @return Promise<base64|File|null> 当输入file为空时返回null */ static compressImage(file: File | Blob | string, limitSize?: number, resultType?: "base64" | "file", options?: Compressor.Options): Promise<string | File | Blob | null>; /** * 根据文件地址获取文件的base64编码(发送fetch网络请求) * @param filePath 文件地址(网址) * @return Promise<string | ArrayBuffer | null | undefined> */ static getBase64ByFilePath(filePath: string): Promise<string | ArrayBuffer | null | undefined>; /** * 根据文件地址获取文件Blob(发送fetch网络请求) * @param filePath 文件地址(网址) * @return Promise<Blob> */ static getBlobByFilePath(filePath: string): Promise<Blob>; /** * 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; /** * 将字符串转换为Blob对象 * @param content 要转换的字符串内容 * @param mimeType Blob的MIME类型,默认为'text/plain' * @returns Blob 包含字符串数据的Blob对象 */ static stringToBlob(content: string, mimeType?: string): Blob; /** * 把字符串转成Unicode编码字符串 * @param str 字符串 */ static encodeStr2Hex(str: string): string; /** * 把Unicode编码字符串解码成字符串 * @param str Unicode编码字符串 */ static decodeHex2Str(str: string): string; /** * 从文件路径中提取文件名(带后缀) * @param filePath 文件路径(可以是 URL、绝对路径或相对路径) * @returns String 带后缀的文件名 * * @example getFileName("https://example.com/images/logo.png") // "logo.png" * @example getFileName("/home/user/docs/report.pdf") // "report.pdf" * @example getFileName("C:\\Users\\Public\\Documents\\data.csv") // "data.csv" * @example getFileName("src/utils/index.ts") // "index.ts" * @example getFileName("archive.tar.gz") // "archive.tar.gz" * @example getFileName("file-with-query?param=value") // "file-with-query" * @example getFileName("directory/with/trailing/slash/") // "" */ static getFileNameByPath(filePath: string): string; /** * 格式化文件大小(['Bytes', 'Kb', 'M', 'G']) * @param bytes */ static formatFileSize(bytes: number): 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 dbTotalCount 模拟数据库中存在的总记录条数,默认52(当createItemFn为数组时,取createItemFn的长度) * @param errorProbability 模拟网络错误概率,范围[0-1)默认0.05 * @param delay 模拟延迟时间,默认1000毫秒 * @returns Promise<{ pageNo: number, pageSize: number, totalCount: number, pageCount: number, resultList: T[] }> */ static randomPageDataAsync<T = any>(createItemFn?: ((index: number) => T) | T[] | null | undefined, pageNo?: number, pageSize?: number, dbTotalCount?: number, errorProbability?: number, delay?: number): Promise<{ pageNo: number; pageSize: number; totalCount: number; pageCount: number; resultList: T[]; }>; /** * 模拟分页数据(同步方式,如果需要模拟网络延迟可在外部进行异步调用) * @param createItemFn (可选)创建单条数据的函数或所有记录数组(其中函数参数index为对应item在总记录数中的序列号,从1开始;当为数组类型时,totalCount被自动设置为数组长度) * @param pageNo 当前请求的页号,默认1(当传入非法数据时返回空数组) * @param pageSize 每页数据条数,默认10 * @param totalCount 模拟数据库中存在的总记录条数,默认52(当createItemFn为数组时,取createItemFn的长度) * @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 len 目标长度 * @param fillCharacter 填充字符(默认为空格) * @param leftPad 是否左填充(默认为右填充) * @returns 填充后的新字符串 */ static padString(str: string | null | undefined, len: number, fillCharacter?: string, leftPad?: boolean): 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; } /** * 批量校验字段配置类型 */ interface ValidateFieldType { value: any; msg?: string; validator?: (value: any) => boolean; validatorMsg?: string; } /** * 校验工具类 */ declare class ValidatorUtil { /** * 批量校验字段 * @param fieldArr 字段配置数组 ValidateFieldType[],{ value: any, msg?: string , validator?: (value: any) => boolean, validatorMsg?: string } <br> * - 当msg非空则对value进行非空校验,若校验失败直接返回msg * - 当validatorMsg和validator同时非空时对value进行validator校验,若校验失败直接返回validatorMsg * @returns 若返回非空字符串表示校验失败的提示内容,否则校验通过 */ static validateFields(fieldArr: ValidateFieldType[]): string; /** * 检测数据是否为空的综合方法 * @param value 任意类型输入值 * @returns true空,false非空 */ static isEmpty(value: unknown): 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; /** * 检测传入的树形结构的最大层级数 * @param tree 树形结构数据 * @param kName 键名称(默认value) * @param vName 值名称(默认text) * @param childrenName 子级数组名称(默认children) */ static getTreeMaxDepth(tree: any, kName?: string, vName?: string, childrenName?: string): number; /** * 获取树形结构中指定第一层索引元素及其所有嵌套的第一个子级元素的键组成的字符串数组 * @param firstDepthIndex 第一层的索引 * @param tree 树形结构 * @param kName 键名称 * @param childrenName 子级数组名称 */ static getKeysByFirstDepthIndex(firstDepthIndex?: number, tree?: any, kName?: string, childrenName?: string): string[]; } /** * 缓存工具类(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 EncryptUtil: typeof EncryptUtil; 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, EncryptUtil, FileUtil, HtmlUtil, IdCardUtil, KVInfo, Mergeable, OtherUtil, PlatformType, RandomUtil, RegularUtil, SVInfo, StringUtil, TextValue, TreeUtil, ValidateFieldType, ValidatorUtil };