当前位置: 首页 > news >正文

HarmonyOS 组件参数类型校验怎么做才对?TypeUtil 全面实战

文章目录

    • 背景
      • 方法总览
      • 综合 TypeUtil 所有方法
      • 场景一:处理 ResourceStr 类型参数
      • 场景二:正确处理 catch 块的错误
      • 场景三:判断函数是否异步
      • 场景四:处理二进制数据
      • 一张图总结 TypeUtil 的使用决策树
      • 写在最后

背景

近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓
写通用组件的时候,最头疼的问题之一是:参数可能传各种类型,如何在运行时做精确判断?

ArkTS 的类型系统在编译时很严格,但运行时的类型判断还是需要TypeUtil来帮忙。

方法总览

综合 TypeUtil 所有方法

先快速回顾 TypeUtil Demo 里覆盖的所有方法:

基础类型:

TypeUtil.isBoolean(true)// → trueTypeUtil.isBoolean("true")// → falseTypeUtil.isNumber(42)// → trueTypeUtil.isNumber("42")// → falseTypeUtil.isString("hello")// → trueTypeUtil.isString(123)// → falseTypeUtil.isObject({a:1})// → trueTypeUtil.isArray([1,2,3])// → trueTypeUtil.isArray({})// → falseTypeUtil.isFunction(()=>{})// → true

HarmonyOS Resource 类型:

TypeUtil.isResource($r('app.string.app_name'))// → trueTypeUtil.isResource("plain string")// → falseTypeUtil.isResourceStr("text")// → trueTypeUtil.isResourceStr($r('app.string.app_name'))// → true

容器类型:

TypeUtil.isMap(newMap())// → trueTypeUtil.isMap({})// → falseTypeUtil.isWeakMap(newWeakMap())// → trueTypeUtil.isSet(newSet([1,2]))// → trueTypeUtil.isWeakSet(newWeakSet())// → true

特殊对象:

TypeUtil.isDate(newDate())// → trueTypeUtil.isDate("2024-01-01")// → falseTypeUtil.isRegExp(/abc/g)// → trueTypeUtil.isDataView(newDataView(buf))// → trueTypeUtil.isArrayBuffer(newArrayBuffer(4))// → trueTypeUtil.isUint8Array(newUint8Array())// → trueTypeUtil.isTypedArray(newFloat32Array())// → true

异步与错误:

TypeUtil.isPromise(Promise.resolve())// → trueTypeUtil.isAsyncFunction(async()=>{})// → trueTypeUtil.isAsyncFunction(()=>{})// → falseTypeUtil.isNativeError(newError('err'))// → trueTypeUtil.isNativeError("string")// → false

场景一:处理 ResourceStr 类型参数

HarmonyOS 开发中经常遇到ResourceStr = string | Resource类型的参数,需要分别处理:

// 判断是 Resource 对象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 接受两种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)}`);})

场景二:正确处理 catch 块的错误

this.Btn('isNativeError(new Error("err")) → true','#C0392B',()=>{this.addLog(`isNativeError(new Error()) →${TypeUtil.isNativeError(newError('err'))}`);})this.Btn('isNativeError("string") → false','#C0392B',()=>{this.addLog(`isNativeError("string") →${TypeUtil.isNativeError("string")}`);})

实际业务里的健壮错误处理:

functionhandleError(e:unknown):string{if(TypeUtil.isNativeError(e)){// 标准 Error 对象,访问 message 和 stackreturn(easError).message;}elseif(TypeUtil.isString(e)){// 字符串类型的错误returneasstring;}else{// 其他类型returnJSON.stringify(e);}}

场景三:判断函数是否异步

this.Btn('isAsyncFunction(async ()=>{}) → true','#6C3483',()=>{constfn=async()=>{};this.addLog(`isAsyncFunction(async ()=>{}) →${TypeUtil.isAsyncFunction(fn)}`);})this.Btn('isAsyncFunction(()=>{}) → false','#6C3483',()=>{constfn=()=>{};this.addLog(`isAsyncFunction(()=>{}) →${TypeUtil.isAsyncFunction(fn)}`);})

场景四:处理二进制数据

this.Btn('isArrayBuffer(new ArrayBuffer(4)) → true','#2C3E50',()=>{this.addLog(`isArrayBuffer(new ArrayBuffer(4)) →${TypeUtil.isArrayBuffer(newArrayBuffer(4))}`);})this.Btn('isUint8Array(new Uint8Array()) → true','#34495E',()=>{this.addLog(`isUint8Array(new Uint8Array()) →${TypeUtil.isUint8Array(newUint8Array())}`);})this.Btn('isTypedArray(new Float32Array()) → true','#626567',()=>{this.addLog(`isTypedArray(new Float32Array()) →${TypeUtil.isTypedArray(newFloat32Array())}`);})

一张图总结 TypeUtil 的使用决策树

需要判断类型? ├── 是基础类型(boolean/number/string/object/array/function)? │ → 用 isBoolean/isNumber/isString/isObject/isArray/isFunction ├── 是 HarmonyOS Resource 类型? │ → 用 isResource 或 isResourceStr ├── 是容器类型(Map/Set/WeakMap/WeakSet)? │ → 用对应的 isMap/isSet/isWeakMap/isWeakSet ├── 是特殊对象(Date/RegExp/DataView)? │ → 用 isDate/isRegExp/isDataView ├── 是二进制数据(ArrayBuffer/TypedArray)? │ → 用 isArrayBuffer/isUint8Array/isTypedArray 等 ├── 是异步相关(Promise/async函数)? │ → 用 isPromise/isAsyncFunction └── 是错误对象? → 用 isNativeError

写在最后

TypeUtil 覆盖了 HarmonyOS ArkTS 开发中几乎所有需要精确类型检测的场景。

从简单的isStringisArray,到 HarmonyOS 特有的isResource,再到isPromiseisNativeError——基本上你能想到的类型判断需求都有对应方法。

建议在项目的工具库里引入 TypeUtil,把它当成typeof的升级替代品来使用。

http://www.jsqmd.com/news/941625/

相关文章:

  • STC8F单片机上基于RTX51 Tiny的三路LED独立闪烁工程(Keil C51可直接编译)
  • Esxi 7.0装好后必做的5件事:从激活许可证到上传ISO镜像的完整配置流程
  • 别再降级Pillow了!YOLOv5 7.0中文标签训练与显示完整避坑指南(附字体配置)
  • 长沙黄金回收实地测评:6家机构检测称重报价全纪实 - 黄金上门回收
  • 闲置猫眼猫享卡如何妥善处置?实用实操回收指南 - 购物卡回收找京尔回收
  • Oracle EBS 的关联交易体系,本质上是一套“以法人合规为边界,以流程自动化为手段,以成本还原为目标
  • Windows Cleaner完整指南:免费开源解决C盘空间不足的终极方案
  • 废纸撕碎机厂家横向解析:2026年废纸回收设备选型全攻略 - 深度智识库
  • 告别拖拽式布局:用SceneBuilder + FXML重构你的JavaFX项目(附完整配置流程)
  • PyQt5样式表扫盲:手把手教你读懂并定制Qt Designer里那段‘神秘代码’(以圆形按钮为例)
  • 小目标检测增强工具集:图像切分+结果拼接+框图可视化(YOLOv5 v6.0+适配)
  • 别再被OneNET应用模拟器卡住:一份给新手的MQTT订阅与属性设置避坑指南
  • 2026深圳添价收名表回收实测:全城高价透明回收,靠谱变现首选 - 薛定谔的梨花猫
  • 21.前端入门必看!猜数字小游戏和表白墙的完整代码实现
  • Egg.js后端+Wechaty微信协议的开箱即用聊天机器人模板
  • 2026滚塑模具制品厂家实力排行榜:本凡机械凭全产业链优势问鼎榜首 - 玖叁鹿
  • 生物识别技术如何解决结核病治疗依从性难题:一个公共卫生领域的创新实践
  • 2026广州荔湾区外贸公司注册攻略|荔湾专业靠谱财税公司推荐 - 资讯速览
  • 3步搞定无边框游戏窗口:告别Alt+Tab卡顿的游戏窗口管理神器
  • Speller100:零样本多语言拼写纠错系统的架构设计与工程实践
  • 山大软院众智科学实验2022全套实操资料:5个C++实验源码+exe+报告+大纲
  • 新手也能搞定的HDMI高速布线:从阻抗匹配到等长绕线的保姆级实战
  • YOLOv8训练自己的跌倒检测数据集:从数据爬取、标注到模型调优的完整避坑指南
  • 2026年重庆AI精准获客与GEO优化:B2B企业短视频运营全链路破局指南 - 企业名录优选推荐
  • 别再傻傻分不清了!一文搞懂卫星测高里的SLA和SSHA(附数据处理实战)
  • 3分钟搞定B站视频转文字:Bili2text终极指南
  • 成套收藏珠宝变现,石家庄合规首饰回收机构挑选干货汇总 - 合扬奢侈品交易中心
  • 兰州装修公司必读:石膏线源头直供vs中间商加价,一篇文章省3000-5000元 - 优质企业观察收录
  • 从Elasticsearch迁移到RedisSearch?我踩过的坑和性能对比全在这了
  • 履约附加费长期存在时跨境卖家如何重设包邮区间