
文章目录背景方法总览为什么需要 TypeUtilisBoolean — 判断布尔值isNumber — 判断数字isString — 判断字符串isObject — 判断对象isArray — 判断数组isFunction — 判断函数isResource / isResourceStr — HarmonyOS 特有实际使用示例总结对比写在最后背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓方法总览为什么需要 TypeUtil先看看typeof的局限性typeof true → boolean ✓ typeof 42 → number ✓ typeof hello → string ✓ typeof null → object ✗应该是null typeof [] → object ✗应该是array typeof new Date → object ✗应该是dateTypeUtil解决的就是这些问题每个类型都有专属的判断方法返回true/false精准可靠。isBoolean — 判断布尔值this.Btn(isBoolean(true) → true,#4A90E2,(){this.addLog(isBoolean(true) →${TypeUtil.isBoolean(true)});})this.Btn(isBoolean(true) → false,#4A90E2,(){this.addLog(isBoolean(true) →${TypeUtil.isBoolean(true)});})运行结果isBoolean(true) → true isBoolean(true) → false字符串true不是布尔值isBoolean返回false——这正是我们想要的精确判断。isNumber — 判断数字this.Btn(isNumber(42) → true,#5A8DEE,(){this.addLog(isNumber(42) →${TypeUtil.isNumber(42)});})this.Btn(isNumber(42) → false,#5A8DEE,(){this.addLog(isNumber(42) →${TypeUtil.isNumber(42)});})运行结果isNumber(42) → true isNumber(42) → false字符串42不是数字类型返回false。isString — 判断字符串this.Btn(isString(hello) → true,#27AE60,(){this.addLog(isString(hello) →${TypeUtil.isString(hello)});})this.Btn(isString(123) → false,#27AE60,(){this.addLog(isString(123) →${TypeUtil.isString(123)});})运行结果isString(hello) → true isString(123) → falseisObject — 判断对象interfaceSampleObj{a:number;}this.Btn(isObject({a:1}) → true,#E67E22,(){constobj:SampleObj{a:1};this.addLog(isObject({a:1}) →${TypeUtil.isObject(obj)});})运行结果isObject({a:1}) → true注意isObject对纯对象返回true但不包含数组数组有专属的isArray。isArray — 判断数组this.Btn(isArray([1,2,3]) → true,#E74C3C,(){this.addLog(isArray([1,2,3]) →${TypeUtil.isArray([1,2,3])});})this.Btn(isArray({}) → false,#E74C3C,(){constobj:SampleObj{a:0};this.addLog(isArray({}) →${TypeUtil.isArray(obj)});})运行结果isArray([1,2,3]) → true isArray({}) → false这就解决了typeof [] object的歧义问题用isArray才是精准判断。isFunction — 判断函数this.Btn(isFunction(() {}) → true,#9B59B6,(){this.addLog(isFunction((){}) →${TypeUtil.isFunction((){})});})this.Btn(isFunction(str) → false,#9B59B6,(){this.addLog(isFunction(str) →${TypeUtil.isFunction(str)});})运行结果isFunction((){}) → true isFunction(str) → falseisResource / isResourceStr — HarmonyOS 特有这是TypeUtil里比较有意思的两个方法专门针对 HarmonyOS 的Resource类型// 判断是否是 Resource 对象$r() 返回的this.Btn(isResource($r(app.string.app_name)) → true,#7B68EE,(){constres$r(app.string.app_name);this.addLog(isResource($r(app.string.app_name)) →${TypeUtil.isResource(res)});})this.Btn(isResource(plain string) → false,#7B68EE,(){this.addLog(isResource(plain string) →${TypeUtil.isResource(plain string)});})// ResourceStr 可以是普通字符串或 Resource 对象this.Btn(isResourceStr(text) → true,#6C5CE7,(){this.addLog(isResourceStr(text) →${TypeUtil.isResourceStr(text)});})this.Btn(isResourceStr($r(app.string.app_name)) → true,#6C5CE7,(){constres$r(app.string.app_name);this.addLog(isResourceStr($r(...)) →${TypeUtil.isResourceStr(res)});})运行结果isResource($r(app.string.app_name)) → true isResource(plain string) → false isResourceStr(text) → true isResourceStr($r(...)) → true区别在于isResource()只有$r()或$rawfile()返回的 Resource 对象才是trueisResourceStr()普通字符串或 Resource 对象都算true因为ResourceStr string | Resource这在封装通用组件时特别有用组件参数可能接受ResourceStr需要在内部判断到底是哪种类型来做不同处理。实际使用示例// 处理 ResourceStr 类型参数的通用函数functiongetText(value:ResourceStr):string{if(TypeUtil.isResource(value)){// 是资源引用需要通过资源管理器获取returngetContext().resourceManager.getStringSync(valueasResource);}else{// 是普通字符串直接返回returnvalueasstring;}}总结对比方法判断目标typeof 能替代吗isBoolean布尔值可以typeof x booleanisNumber数字可以typeof x numberisString字符串可以typeof x stringisObject纯对象不能typeof null/[]也是objectisArray数组不能typeof [] 是 objectisFunction函数可以typeof x functionisResourceHarmonyOS Resource不能isResourceStrstring 或 Resource不能对于isObject和isArray用 TypeUtil 比 typeof 可靠得多。写在最后类型检测看起来简单但typeof的坑是真实存在的。TypeUtil 把这些边界情况都处理好了用起来放心。特别推荐记住isResource和isResourceStr——这是 HarmonyOS 特有的处理$r()资源引用时经常用到。