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

HarmonyOS ArkTS 精确类型检测进阶:TypedArray 系列与容器类型完全指南

文章目录

    • 背景
      • 方法总览
      • Map / WeakMap / Set / WeakSet
      • Date / RegExp / DataView
      • ArrayBuffer 系列
      • TypedArray 系列(Uint8Array、Int32Array 等)
      • 实际使用示例
      • 写在最后

背景

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

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓

方法总览

Map / WeakMap / Set / WeakSet

这四个是 JavaScript/TypeScript 的标准容器类型,TypeUtil 分别提供了对应的检测方法:

// Map 检测this.Btn('isMap(new Map()) → true','#16A085',()=>{this.addLog(`isMap(new Map()) →${TypeUtil.isMap(newMap())}`);})this.Btn('isMap({}) → false','#16A085',()=>{constobj:SampleObj={a:0};this.addLog(`isMap({}) →${TypeUtil.isMap(obj)}`);})// WeakMap 检测this.Btn('isWeakMap(new WeakMap()) → true','#1ABC9C',()=>{this.addLog(`isWeakMap(new WeakMap()) →${TypeUtil.isWeakMap(newWeakMap())}`);})// Set 检测this.Btn('isSet(new Set([1,2])) → true','#2ECC71',()=>{this.addLog(`isSet(new Set([1,2])) →${TypeUtil.isSet(newSet([1,2]))}`);})// WeakSet 检测this.Btn('isWeakSet(new WeakSet()) → true','#27AE60',()=>{this.addLog(`isWeakSet(new WeakSet()) →${TypeUtil.isWeakSet(newWeakSet())}`);})

运行结果:

isMap(new Map()) → true isMap({}) → false isWeakMap(new WeakMap()) → true isSet(new Set([1,2])) → true isWeakSet(new WeakSet()) → true

实际使用场景:

接受通用参数的函数,需要判断传入的是Map还是普通对象{}

functionprocessData(data:Map<string,number>|Record<string,number>){if(TypeUtil.isMap(data)){// 按 Map 处理data.forEach((v,k)=>console.log(k,v));}else{// 按对象处理Object.entries(data).forEach(([k,v])=>console.log(k,v));}}

Date / RegExp / DataView

// Date 检测this.Btn('isDate(new Date()) → true','#F39C12',()=>{this.addLog(`isDate(new Date()) →${TypeUtil.isDate(newDate())}`);})this.Btn('isDate("2024-01-01") → false','#F39C12',()=>{this.addLog(`isDate("2024-01-01") →${TypeUtil.isDate("2024-01-01")}`);})// RegExp 检测this.Btn('isRegExp(/abc/g) → true','#E67E22',()=>{this.addLog(`isRegExp(/abc/g) →${TypeUtil.isRegExp(/abc/g)}`);})// DataView 检测this.Btn('isDataView(new DataView(buf)) → true','#D35400',()=>{constbuf=newArrayBuffer(8);constdv=newDataView(buf);this.addLog(`isDataView(new DataView(buf)) →${TypeUtil.isDataView(dv)}`);})

运行结果:

isDate(new Date()) → true isDate("2024-01-01") → false isRegExp(/abc/g) → true isDataView(new DataView(buf)) → true

isDate("2024-01-01")返回false这个很重要——字符串日期不是 Date 对象,不能直接调.getFullYear()等方法。

ArrayBuffer 系列

// ArrayBuffer 检测this.Btn('isArrayBuffer(new ArrayBuffer(4)) → true','#2C3E50',()=>{this.addLog(`isArrayBuffer(new ArrayBuffer(4)) →${TypeUtil.isArrayBuffer(newArrayBuffer(4))}`);})// AnyArrayBuffer(包含 SharedArrayBuffer)this.Btn('isAnyArrayBuffer(new ArrayBuffer(4)) → true','#2C3E50',()=>{this.addLog(`isAnyArrayBuffer(new ArrayBuffer(4)) →${TypeUtil.isAnyArrayBuffer(newArrayBuffer(4))}`);})

运行结果:

isArrayBuffer(new ArrayBuffer(4)) → true isAnyArrayBuffer(new ArrayBuffer(4)) → true

isArrayBuffer只检测ArrayBufferisAnyArrayBuffer还包含SharedArrayBuffer(共享内存缓冲区)。

TypedArray 系列(Uint8Array、Int32Array 等)

TypedArray 是一系列类型化数组视图,常用于二进制数据处理、网络传输、图像处理等场景:

// Uint8Array(无符号8位,常用于字节数组)this.Btn('isUint8Array(new Uint8Array()) → true','#34495E',()=>{this.addLog(`isUint8Array(new Uint8Array()) →${TypeUtil.isUint8Array(newUint8Array())}`);})// Uint16Array(无符号16位)this.Btn('isUint16Array(new Uint16Array()) → true','#34495E',()=>{this.addLog(`isUint16Array(new Uint16Array()) →${TypeUtil.isUint16Array(newUint16Array())}`);})// Uint32Array(无符号32位)this.Btn('isUint32Array(new Uint32Array()) → true','#34495E',()=>{this.addLog(`isUint32Array(new Uint32Array()) →${TypeUtil.isUint32Array(newUint32Array())}`);})// Int8Array(有符号8位)this.Btn('isInt8Array(new Int8Array()) → true','#7F8C8D',()=>{this.addLog(`isInt8Array(new Int8Array()) →${TypeUtil.isInt8Array(newInt8Array())}`);})// Int16Array(有符号16位)this.Btn('isInt16Array(new Int16Array()) → true','#7F8C8D',()=>{this.addLog(`isInt16Array(new Int16Array()) →${TypeUtil.isInt16Array(newInt16Array())}`);})// Int32Array(有符号32位)this.Btn('isInt32Array(new Int32Array()) → true','#7F8C8D',()=>{this.addLog(`isInt32Array(new Int32Array()) →${TypeUtil.isInt32Array(newInt32Array())}`);})// 泛型判断:是否是任意 TypedArraythis.Btn('isTypedArray(new Float32Array()) → true','#626567',()=>{this.addLog(`isTypedArray(new Float32Array()) →${TypeUtil.isTypedArray(newFloat32Array())}`);})

运行结果:

isUint8Array(new Uint8Array()) → true isUint16Array(new Uint16Array()) → true isUint32Array(new Uint32Array()) → true isInt8Array(new Int8Array()) → true isInt16Array(new Int16Array()) → true isInt32Array(new Int32Array()) → true isTypedArray(new Float32Array()) → true

TypedArray 类型速查:

类型范围常用场景
Uint8Array0~255字节流、图片数据、网络包
Uint16Array0~65535音频采样、字符编码
Uint32Array0~4294967295像素数据(RGBA)、哈希
Int8Array-128~127有符号字节数据
Int16Array-32768~32767音频PCM
Int32Array-231~231-1整型缓冲区
Float32Array32位浮点WebGL/图形计算

如果你只想知道"这是不是某种TypedArray",不在乎具体是哪种,用isTypedArray()最简单。

实际使用示例

处理二进制数据时,经常需要判断传入的是哪种类型:

functionhandleBinaryData(data:Uint8Array|ArrayBuffer){if(TypeUtil.isUint8Array(data)){// 直接用字节视图处理for(leti=0;i<data.length;i++){console.log(data[i]);}}elseif(TypeUtil.isArrayBuffer(data)){// 先包装成视图constview=newUint8Array(data);// ... 处理}}

写在最后

容器类型和特殊对象的判断,用 TypeUtil 比自己写instanceof或者Object.prototype.toString.call()方便太多了。

记住最常用的几个:

  • 容器:isMapisSet
  • 时间:isDate(别用字符串当Date用)
  • 正则:isRegExp
  • 二进制:isArrayBufferisUint8ArrayisTypedArray
http://www.gsyq.cn/news/1450687.html

相关文章:

  • 代发货订单履行:完整指南
  • HarmonyOS ArkTS 判断 Promise 与异步函数的正确姿势:TypeUtil 实战教程
  • 国内工业级3D打印代加工服务商实测排行 - 优质品牌商家
  • 底轴旋转坝技术深度解析:钢坝、钢闸门、防洪闸、合页坝、底轴旋转坝、弧形闸门、拦河坝、景观坝、智能一体化闸门、气动浮体坝选择指南 - 优质品牌商家
  • 请结合以下说明,先完成类似python的内置函数。 然后再去完成内置库(标准款) ‌内置函数‌
  • 2026年6月安庆黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐
  • 2026数字展厅设计技术干货:数字孪生沙盘、数字孪生钢厂、数字展厅、数字沙盘、虚拟展厅、设备数字孪生、360全息柜选择指南 - 优质品牌商家
  • HarmonyOS 拉起系统浏览器与短信界面:WantUtil.toWebBrowser 与 startMMS 实战
  • 2026年更新:浙江生产线定制厂家选型指南与趋势洞察 - 2026年企业资讯
  • Agent的四种执行模式,解锁人机协作新境界!
  • 如何快速部署HS2-HF Patch:解锁Honey Select 2完整游戏体验的终极指南
  • 动手实验:用Python和Mininet验证TCP Cubic/BBR的Jain公平性指数
  • win11中启用经典win10右键菜单和还原默认win11右键菜单如何操作
  • 【判断正负】信息学奥赛一本通C语言解法(题号1039)
  • 2026年当下,迪庆好的学校保洁机构如何选?腾兴物业深度解析 - 2026年企业资讯
  • 四川地坪工程技术解析及2026年主流服务商盘点:宜宾彩色epdm颗粒供货商公司/宜宾彩色艺术地坪公司/实力盘点 - 优质品牌商家
  • 【算法分析与设计】第36篇:计算几何基础:凸包问题的分治与扫描线解法
  • ESET-KeyGen终极指南:5分钟掌握ESET安全软件免费试用激活技巧
  • 2026冲刺用!AI论文网站测评:最新推荐与实用对比
  • 2026年物流仓配系统品牌TOP5排行及选型参考 - 优质品牌商家
  • 51单片机驱动直流电机+LabVIEW实时监控调速实操资源包
  • 第三方实测测评:极客速达海外一件代发,中小跨境卖家优选供应链服务商 - 星际AI
  • 从VR到裸眼3D:用UE5 SpatialLabs插件开发,你需要绕开哪些‘思维定式’?
  • 做AI编码开发,我终于戒掉“显卡算力焦虑”:弃RTX5060选M4 Mac Mini实录
  • 2026年q2仓配管理软件品牌评测:仓储配送管理系统/仓库智能管理系统/仓库订单管理系统/从场景到实效的选型参考 - 优质品牌商家
  • Java基础:Math工具类全方位详解
  • 防火墙为什么能根据 IP 地址过滤?IP 不是会变的吗?
  • 自指螺旋与电子内禀自旋的对应关系推导(世毫九实验室原创研究)
  • 如何用Python自动化抢票神器告别演唱会门票秒光烦恼
  • Prompt调优避坑手册,为什么你写的总差点意思