当前位置: 首页 > 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.jsqmd.com/news/939282/

相关文章:

  • 代发货订单履行:完整指南
  • 如何用WeChatMsg永久保存微信聊天记录?你的数字记忆守护终极指南
  • 经典蓝牙(BR/EDR)开发实战
  • 别再浪费你的游戏数据了!用Python+PyTorch实现DQN经验回放(附完整代码)
  • 发现用明道中文编程语言打包的hanoi.exe文件是22M,有点大啊,还能通过什么技术手段更小一些吗?(先维持原样)
  • Claude Code 平替来了?DeepSeek-TUI 保姆级安装教程
  • 底轴旋转坝技术深度解析:钢坝、钢闸门、防洪闸、合页坝、底轴旋转坝、弧形闸门、拦河坝、景观坝、智能一体化闸门、气动浮体坝选择指南 - 优质品牌商家
  • 性能相当于第四代骁龙8s
  • HarmonyOS ArkTS 判断 Promise 与异步函数的正确姿势:TypeUtil 实战教程
  • 国内工业级3D打印代加工服务商实测排行 - 优质品牌商家
  • Windows宝塔面板启动卡死?别急着重装,先试试这个服务修复大法
  • 双系统党必看:Ubuntu 18.04下Windows 10启动盘制作与bootmgfw.efi丢失修复全记录
  • QRemeshify:基于QuadWild算法的Blender四边形重拓扑技术深度解析
  • HarmonyOS 拉起系统浏览器与短信界面:WantUtil.toWebBrowser 与 startMMS 实战
  • 请结合以下说明,先完成类似python的内置函数。 然后再去完成内置库(标准款) ‌内置函数‌
  • 2026年6月安庆黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐
  • 基于Arduino Uno与七段数码管的简易任务计数器设计与实现
  • 2026数字展厅设计技术干货:数字孪生沙盘、数字孪生钢厂、数字展厅、数字沙盘、虚拟展厅、设备数字孪生、360全息柜选择指南 - 优质品牌商家
  • 多设备组网与Mesh网络入门
  • 从新手到高手:Smithbox游戏修改工具完全指南 [特殊字符]
  • 2026年更新:浙江生产线定制厂家选型指南与趋势洞察 - 2026年企业资讯
  • 仿真绿植绿化技术核心要点及服务商选择参考推荐:仿真绿植绿化工程/仿真绿植绿化电话/四川仿真绿植绿化/优选指南 - 优质品牌商家
  • Claude Code使用教程(vibe coding) 二
  • GlosSI 入门指南:让 Steam 控制器在任意游戏和应用中畅玩
  • 四川智慧垃圾箱厂家排行:四川楼顶发光字/四川民宿集装箱/四川苹果舱/四川钢结构仿木屋/合规性与服务能力实测对比 - 优质品牌商家
  • 2026年近期如何筛选靠谱的气力输送设备优质厂家:以天顺机械为例的专业解析 - 2026年企业资讯
  • Agent的四种执行模式,解锁人机协作新境界!
  • 如何快速部署HS2-HF Patch:解锁Honey Select 2完整游戏体验的终极指南
  • 别再死记硬背了!用Python手撸一个ID3决策树,从熵到分类器一次搞懂
  • 专为食品进出口打造的外贸ERP!智能生成发票、质检报告高效合规