1# @arkts.utils (ArkTS工具库) 2 3本模块提供了各种ArkTS实用工具函数。 4 5> **说明:** 6> 7> 本模块首批接口从API version 12开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 8> 9> 此模块仅支持在ArkTS文件(文件后缀为.ets)中导入使用。 10 11## 导入模块 12 13```ts 14import { ArkTSUtils } from '@kit.ArkTS' 15``` 16 17## ArkTSUtils.locks 18 19为了解决多并发实例间的数据竞争问题,ArkTS语言基础库引入了异步锁能力。为了开发者的开发效率,AsyncLock对象支持跨并发实例引用传递。 20 21由于ArkTS语言支持异步操作,阻塞锁容易产生死锁问题,因此我们在ArkTS中仅支持异步锁(非阻塞式锁)。 22 23使用异步锁的方法需要标记为async,调用方需要await修饰调用,才能保证时序正确。因此会导致外层调用函数全部标记成async。 24 25### AsyncLockCallback 26 27type AsyncLockCallback\<T> = () => T | Promise\<T> 28 29这是一个补充类型别名,表示[lockAsync](#lockasync)函数所有重载中的回调。 30 31**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 32 33**系统能力:** SystemCapability.Utils.Lang 34 35### AsyncLock 36 37实现异步锁功能的类,允许在锁下执行异步操作。 38 39#### 属性 40 41**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 42 43**系统能力:** SystemCapability.Utils.Lang 44 45| 名称 | 类型 | 可读 | 可写 | 说明 | 46| ---- | ------ | ---- | ---- | ---------- | 47| name | string | 是 | 否 | 锁的名称。 | 48 49**示例:** 50 51```ts 52// 示例一: 53@Sendable 54class A { 55 count_: number = 0; 56 async getCount(): Promise<number> { 57 let lock: ArkTSUtils.locks.AsyncLock = ArkTSUtils.locks.AsyncLock.request("lock_1"); 58 return lock.lockAsync(() => { 59 return this.count_; 60 }) 61 } 62 async setCount(count: number) { 63 let lock: ArkTSUtils.locks.AsyncLock = ArkTSUtils.locks.AsyncLock.request("lock_1"); 64 await lock.lockAsync(() => { 65 this.count_ = count; 66 }) 67 } 68} 69 70// 示例二: 71@Sendable 72class A { 73 count_: number = 0; 74 lock_: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock(); 75 async getCount(): Promise<number> { 76 return this.lock_.lockAsync(() => { 77 return this.count_; 78 }) 79 } 80 async setCount(count: number) { 81 await this.lock_.lockAsync(() => { 82 this.count_ = count; 83 }) 84 } 85} 86 87@Concurrent 88async function foo(a: A) { 89 await a.setCount(10) 90} 91``` 92 93#### constructor 94 95constructor() 96 97默认构造函数。创建一个异步锁。 98 99**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 100 101**系统能力:** SystemCapability.Utils.Lang 102 103**返回值:** 104 105| 类型 | 说明 | 106| ----------------------- | ------------------ | 107| [AsyncLock](#asynclock) | 创建的异步锁实例。 | 108 109**示例:** 110 111```ts 112let lock = new ArkTSUtils.locks.AsyncLock(); 113``` 114 115#### request 116 117static request(name: string): AsyncLock 118 119使用指定的名称查找或创建(如果未找到)异步锁实例。 120 121**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 122 123**系统能力:** SystemCapability.Utils.Lang 124 125**参数:** 126 127| 名称 | 类型 | 必填 | 说明 | 128| ---- | ------ | ---- | -------------------------------- | 129| name | string | 是 | 按指定名称查找或创建异步锁实例。 | 130 131**返回值:** 132 133| 类型 | 说明 | 134| ----------------------- | -------------------------------- | 135| [AsyncLock](#asynclock) | 返回查找到或创建后的异步锁实例。 | 136 137**示例:** 138 139```ts 140let lockName = 'isAvailableLock'; 141let lock = ArkTSUtils.locks.AsyncLock.request(lockName); 142``` 143 144#### query 145 146static query(name: string): AsyncLockState 147 148查询指定异步锁的信息。 149 150**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 151 152**系统能力:** SystemCapability.Utils.Lang 153 154**参数:** 155 156| 名称 | 类型 | 必填 | 说明 | 157| ---- | ------ | ---- | ---------- | 158| name | string | 是 | 锁的名称。 | 159 160**返回值:** 161 162| 类型 | 说明 | 163| --------------------------------- | ---------------------------------- | 164| [AsyncLockState](#asynclockstate) | 一个包含状态描述的异步锁状态实例。 | 165 166**错误码:** 167 168以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 169 170| 错误码ID | 错误信息 | 171| -------- | ------------- | 172| 10200030 | The lock does not exist. | 173 174**示例:** 175 176```ts 177// 你已经在别的地方创建了一个锁。 178// let lock = ArkTSUtils.locks.AsyncLock.request("queryTestLock"); 179let state = ArkTSUtils.locks.AsyncLock.query('queryTestLock'); 180if (!state) { 181 throw new Error('测试失败:期望有效的状态,但得到的是 ' + state); 182} 183let pending: ArkTSUtils.locks.AsyncLockInfo[] = state.pending; 184let held: ArkTSUtils.locks.AsyncLockInfo[] = state.held; 185``` 186 187#### queryAll 188 189static queryAll(): AsyncLockState[] 190 191查询所有现有锁的信息。 192 193**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 194 195**系统能力:** SystemCapability.Utils.Lang 196 197**返回值:** 198 199| 类型 | 说明 | 200| ----------------------------------- | -------------------------------- | 201| [AsyncLockState](#asynclockstate)[] | 包含锁状态信息的异步锁状态数组。 | 202 203**示例:** 204 205```ts 206let states: ArkTSUtils.locks.AsyncLockState[] = ArkTSUtils.locks.AsyncLock.queryAll(); 207if (states.length == 0) { 208 throw new Error('测试失败:期望至少有1个状态,但得到的是 ' + states.length); 209} 210``` 211 212#### lockAsync 213 214lockAsync\<T>(callback: AsyncLockCallback\<T>): Promise\<T> 215 216在获取的锁下独占执行操作。该方法首先获取锁,然后调用回调,最后释放锁。回调在调用[lockAsync](#lockasync)的同一线程中以异步方式执行。 217 218**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 219 220**系统能力:** SystemCapability.Utils.Lang 221 222**参数:** 223 224| 名称 | 类型 | 必填 | 说明 | 225| -------- | --------------------------------------- | ---- | ---------------------- | 226| callback | [AsyncLockCallback](#asynclockcallback) | 是 | 获取锁后要调用的函数。 | 227 228**返回值:** 229 230| 类型 | 说明 | 231| ----------- | --------------------------- | 232| Promise\<T> | 回调执行后将解决的Promise。 | 233 234**错误码:** 235 236以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 237 238| 错误码ID | 错误信息 | 239| -------- | ------------- | 240| 10200030 | The lock does not exist. | 241 242**示例:** 243 244```ts 245let lock = new ArkTSUtils.locks.AsyncLock(); 246let p1 = lock.lockAsync<void>(() => { 247 // 执行某些操作 248}); 249``` 250 251#### lockAsync 252 253lockAsync\<T>(callback: AsyncLockCallback\<T>, mode: AsyncLockMode): Promise\<T> 254 255在获取的锁下执行操作。该方法首先获取锁,然后调用回调,最后释放锁。回调在调用[lockAsync](#lockasync)的同一线程中以异步方式执行。 256 257**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 258 259**系统能力:** SystemCapability.Utils.Lang 260 261**参数:** 262 263| 名称 | 类型 | 必填 | 说明 | 264| -------- | --------------------------------------- | ---- | ---------------------- | 265| callback | [AsyncLockCallback](#asynclockcallback) | 是 | 获取锁后要调用的函数。 | 266| mode | [AsyncLockMode](#asynclockmode) | 是 | 锁的操作模式。 | 267 268**返回值:** 269 270| 类型 | 说明 | 271| ----------- | --------------------------- | 272| Promise\<T> | 回调执行后将解决的Promise。 | 273 274**错误码:** 275 276以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 277 278| 错误码ID | 错误信息 | 279| -------- | ------------- | 280| 10200030 | The lock does not exist. | 281 282**示例:** 283 284```ts 285let lock = new ArkTSUtils.locks.AsyncLock(); 286let p1 = lock.lockAsync<void>(() => { 287 // 执行某些操作 288}, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE); 289``` 290 291#### lockAsync 292 293lockAsync\<T, U>(callback: AsyncLockCallback\<T>, mode: AsyncLockMode, options: AsyncLockOptions\<U>): Promise\<T | U> 294 295在获取的锁下执行操作。该方法首先获取锁,然后调用回调,最后释放锁。回调在调用[lockAsync](#lockasync)的同一线程中以异步方式执行。在[AsyncLockOptions](#asynclockoptions)中可以提供一个可选的超时值。在这种情况下,如果超时前未能获取锁,lockAsync将拒绝返回的Promise并带上一个BusinessError实例。这种情况下,错误信息将包含持有的锁和等待的锁的信息以及可能的死锁警告。 296 297**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 298 299**系统能力:** SystemCapability.Utils.Lang 300 301**参数:** 302 303| 名称 | 类型 | 必填 | 说明 | 304| -------- | ----------------------------------------- | ---- | ---------------------- | 305| callback | [AsyncLockCallback](#asynclockcallback) | 是 | 获取锁后要调用的函数。 | 306| mode | [AsyncLockMode](#asynclockmode) | 是 | 锁的操作模式。 | 307| options | [AsyncLockOptions\<U>](#asynclockoptions) | 是 | 锁的操作选项。 | 308 309**返回值:** 310 311| 类型 | 说明 | 312| ---------------- | -------------------------------------------------- | 313| Promise\<T \| U> | 回调执行后解决的Promise,或者在超时情况下被拒绝。 | 314 315**错误码:** 316 317以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。 318 319| 错误码ID | 错误信息 | 320| -------- | ----------------- | 321| 10200030 | The lock does not exist. | 322| 10200031 | Timeout exceeded. | 323 324**示例:** 325 326```ts 327let lock = new ArkTSUtils.locks.AsyncLock(); 328let options = new ArkTSUtils.locks.AsyncLockOptions<void>(); 329options.timeout = 1000; 330let p: Promise<void> = lock.lockAsync<void, void>( 331 () => { 332 // 执行某些操作 333 }, 334 ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE, 335 options 336); 337``` 338 339### AsyncLockMode 340 341锁操作对应的模式枚举。 342 343**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 344 345**系统能力:** SystemCapability.Utils.Lang 346 347| 名称 | 值 | 说明 | 348| --------- | --- | -------------------------------------------------------- | 349| SHARED | 1 | 共享锁模式。如果指定了此模式,可以在任意线程同时执行。 | 350| EXCLUSIVE | 2 | 独占锁模式。如果指定了此模式,仅在独占获取锁时才能执行。 | 351 352**示例:** 353 354```ts 355let lock = new ArkTSUtils.locks.AsyncLock(); 356// shared0可获取锁并开始执行 357lock.lockAsync(async () => { 358 console.log('shared0'); 359 await new Promise<void>((resolve) => setTimeout(resolve, 1000)); 360}, ArkTSUtils.locks.AsyncLockMode.SHARED); 361// shared1可获取锁并开始执行,无需等待shared0 362lock.lockAsync(async () => { 363 console.log('shared1'); 364 await new Promise<void>((resolve) => setTimeout(resolve, 1000)); 365}, ArkTSUtils.locks.AsyncLockMode.SHARED); 366// exclusive0需等待shared0、1执行完后才可获取锁并执行 367lock.lockAsync(async () => { 368 console.log('exclusive0'); 369 await new Promise<void>((resolve) => setTimeout(resolve, 1000)); 370}, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE); 371// shared2需等待exclusive0执行完后才可获取锁并执行 372lock.lockAsync(async () => { 373 console.log('shared2'); 374 await new Promise<void>((resolve) => setTimeout(resolve, 1000)); 375}, ArkTSUtils.locks.AsyncLockMode.SHARED); 376// shared3需等待exclusive0执行完后才可获取锁并执行,无需等待shared2 377lock.lockAsync(async () => { 378 console.log('shared3'); 379 await new Promise<void>((resolve) => setTimeout(resolve, 1000)); 380}, ArkTSUtils.locks.AsyncLockMode.SHARED); 381``` 382 383### AsyncLockOptions 384 385class AsyncLockOptions\<T> 386 387表示锁操作选项的类。 388 389**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 390 391**系统能力:** SystemCapability.Utils.Lang 392 393#### constructor 394 395constructor() 396 397默认构造函数。创建一个所有属性均具有默认值的异步锁配置项实例。 398 399**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 400 401**系统能力:** SystemCapability.Utils.Lang 402 403**返回值:** 404 405| 类型 | 说明 | 406| ------------------------------------- | ---------------------- | 407| [AsyncLockOptions](#asynclockoptions) | 新的异步锁配置项实例。 | 408 409**示例:** 410 411```ts 412let s: ArkTSUtils.locks.AbortSignal<string> = { aborted: false, reason: 'Aborted' }; 413let options = new ArkTSUtils.locks.AsyncLockOptions<string>(); 414options.isAvailable = false; 415options.signal = s; 416``` 417 418#### 属性 419 420| 名称 | 类型 | 可读 | 可写 | 说明 | 421| ----------- | ------------------------------------- | ---- | ---- | ------------------------------------------------------------------------------------------------------------------------- | 422| isAvailable | boolean | 是 | 是 | 当前锁是否可用。取值为true,则只有在尚未持有锁定请求时才会授予该锁定请求;为false则表示将等待当前锁被释放。默认为 false。 | 423| signal | [AbortSignal\<T>](#abortsignal)\|null | 是 | 是 | 用于中止异步操作的对象。如果signal.aborted为true,则锁请求将被丢弃;为null则请求正常排队运行。默认为 null。 | 424| timeout | number | 是 | 是 | 锁操作的超时时间(毫秒)。如果该值大于零,且运行超过该时间,[lockAsync](#lockasync)将返回被拒绝的Promise。默认为 0。 | 425 426### AsyncLockState 427 428用于存储特定异步锁实例上当前执行的所有锁操作的信息的类。 429 430**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 431 432**系统能力:** SystemCapability.Utils.Lang 433 434#### 属性 435 436| 名称 | 类型 | 可读 | 可写 | 说明 | 437| ------- | --------------------------------- | ---- | ---- | ---------------- | 438| held | [AsyncLockInfo[]](#asynclockinfo) | 是 | 是 | 持有的锁信息。 | 439| pending | [AsyncLockInfo[]](#asynclockinfo) | 是 | 是 | 等待中的锁信息。 | 440 441### AsyncLockInfo 442 443关于锁的信息。 444 445**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 446 447**系统能力:** SystemCapability.Utils.Lang 448 449#### 属性 450 451| 名称 | 类型 | 可读 | 可写 | 说明 | 452| --------- | ------------------------------- | ---- | ---- | --------------------------------------------------------- | 453| name | string | 是 | 是 | 锁的名称。 | 454| mode | [AsyncLockMode](#asynclockmode) | 是 | 是 | 锁的模式。 | 455| contextId | number | 是 | 是 | [AsyncLockMode](#asynclockmode)调用者的执行上下文标识符。 | 456 457### AbortSignal 458 459用于中止异步操作的对象。该类的实例必须在其创建的同一线程中访问。从其他线程访问此类的字段会导致未定义的行为。 460 461**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 462 463**系统能力:** SystemCapability.Utils.Lang 464 465#### 属性 466 467| 名称 | 类型 | 可读 | 可写 | 说明 | 468| ------- | ------- | ---- | ---- | ---------------------------------------------------------------- | 469| aborted | boolean | 是 | 是 | 设置为true以中止操作。 | 470| reason | \<T> | 是 | 是 | 中止的原因。此值将用于拒绝[lockAsync](#lockasync)返回的Promise。 | 471 472## ArkTSUtils.ASON 473 474为支持将JSON字符串解析成共享数据,即[Sendable支持的数据类型](../../arkts-utils/arkts-sendable.md#sendable支持的数据类型),ArkTS语言基础库新增了ASON工具。ASON支持开发者解析JSON字符串,并生成共享数据进行跨并发域传输,同时ASON也支持将共享数据转换成JSON字符串。 475 476### ISendable 477 478type ISendable = lang.ISendable 479 480ISendable是所有Sendable类型(除`null`和`undefined`)的父类型。自身没有任何必须的方法和属性。 481 482**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 483 484**系统能力:** SystemCapability.Utils.Lang 485 486| 类型 | 说明 | 487| ------ | ------ | 488| [lang.ISendable](js-apis-arkts-lang.md#langisendable) | 所有Sendable类型的父类型。 | 489 490### Transformer 491 492type Transformer = (this: ISendable, key: string, value: ISendable | undefined | null) => ISendable | undefined | null 493 494用于转换结果函数的类型。 495 496**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 497 498**系统能力:** SystemCapability.Utils.Lang 499 500**参数:** 501 502| 参数名 | 类型 | 必填 | 说明 | 503| ------ | ------ | ---- | --------------- | 504| this | [ISendable](#isendable) | 是 | 在解析的键值对所属的对象。| 505| key | string | 是 | 属性名。| 506| value | [ISendable](#isendable) | 是 | 在解析的键值对的值。| 507 508**返回值:** 509 510| 类型 | 说明 | 511| -------- | -------- | 512| [ISendable](#isendable) \| undefined \| null | 返回转换结果后的ISendable对象或undefined或null。| 513 514### BigIntMode 515 516定义处理BigInt的模式。 517 518**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 519 520**系统能力:** SystemCapability.Utils.Lang 521 522| 名称 | 值| 说明 | 523| ------ | ------ | --------------- | 524| DEFAULT | 0 |不支持BigInt。| 525| PARSE_AS_BIGINT | 1 |当整数小于-(2^53-1)或大于(2^53-1)时,解析为BigInt。| 526| ALWAYS_PARSE_AS_BIGINT | 2 |所有整数都解析为BigInt。| 527 528### ParseReturnType 529 530定义解析结果的返回类型。 531 532**系统能力:** SystemCapability.Utils.Lang 533 534| 名称 | 值| 说明 | 535| ------ | ------ | --------------- | 536| OBJECT | 0 |返回 SendableObject 对象。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。| 537| MAP<sup>13+</sup> | 1 |返回 SendableMap 对象。<br>**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。| 538 539### ParseOptions 540 541解析的选项,可定义处理BigInt的模式与解析结果的返回类型。 542 543**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 544 545**系统能力:** SystemCapability.Utils.Lang 546 547| 名称 | 类型| 必填 | 说明 | 548| ------ | ------ | ---- | --------------- | 549| bigIntMode | [BigIntMode](#bigintmode) | 是 |定义处理BigInt的模式。| 550| parseReturnType | [ParseReturnType](#parsereturntype) | 是 |定义解析结果的返回类型。| 551 552### parse 553 554parse(text: string, reviver?: Transformer, options?: ParseOptions): ISendable | null 555 556用于解析JSON字符串生成ISendable数据或null。 557 558**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 559 560**系统能力:** SystemCapability.Utils.Lang 561 562**参数:** 563 564| 参数名 | 类型 | 必填 | 说明 | 565| ------ | ------ | ---- | --------------- | 566| text | string | 是 | 有效的JSON字符串。| 567| reviver | [Transformer](#transformer) | 否 | 转换函数,传入该参数,可以用来修改解析生成的原始值。默认值是undefined。目前只支持传入undefined。| 568| options | [ParseOptions](#parseoptions) | 否 | 解析的配置,传入该参数,可以用来控制解析生成的结果类型。默认值是undefined。| 569 570**返回值:** 571 572| 类型 | 说明 | 573| -------- | -------- | 574| [ISendable](#isendable) \| null | 返回ISendable数据或null。当入参是null时,返回null。| 575 576**示例:** 577 578```ts 579import { lang } from '@kit.ArkTS'; 580import { collections } from '@kit.ArkTS'; 581 582type ISendable = lang.ISendable; 583let jsonText = '{"name": "John", "age": 30, "city": "ChongQing"}'; 584let obj = ArkTSUtils.ASON.parse(jsonText) as ISendable; 585console.info((obj as object)?.["name"]); 586// 期望输出: 'John' 587console.info((obj as object)?.["age"]); 588// 期望输出: 30 589console.info((obj as object)?.["city"]); 590// 期望输出: 'ChongQing' 591 592let options: ArkTSUtils.ASON.ParseOptions = { 593 bigIntMode: ArkTSUtils.ASON.BigIntMode.PARSE_AS_BIGINT, 594 parseReturnType: ArkTSUtils.ASON.ParseReturnType.OBJECT, 595} 596let numberText = '{"largeNumber":112233445566778899}'; 597let numberObj = ArkTSUtils.ASON.parse(numberText,undefined,options) as ISendable; 598 599console.info((numberObj as object)?.["largeNumber"]); 600// 期望输出: 112233445566778899 601 602let options2: ArkTSUtils.ASON.ParseOptions = { 603 bigIntMode: ArkTSUtils.ASON.BigIntMode.PARSE_AS_BIGINT, 604 parseReturnType: ArkTSUtils.ASON.ParseReturnType.MAP, 605 } 606let mapText = '{"largeNumber":112233445566778899}'; 607let map = ArkTSUtils.ASON.parse(mapText,undefined,options2); 608console.info("map is " + map); 609// 期望输出: map is [object SendableMap] 610console.info("largeNumber is " + (map as collections.Map<string,bigint>).get("largeNumber")); 611// 期望输出: largeNumber is 112233445566778899 612``` 613 614### stringify 615 616stringify(value: ISendable | null | undefined): string 617 618该方法将ISendable数据转换为JSON字符串。 619 620能力扩展:该方法支持将Map、Set、[collections.Map](./js-apis-arkts-collections.md#collectionsmap)、[collections.Set](./js-apis-arkts-collections.md#collectionsset)、[HashMap](./js-apis-hashmap.md#hashmap)、[HashSet](./js-apis-hashset.md#hashset)转换为JSON字符串。 621 622**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 623 624**系统能力:** SystemCapability.Utils.Lang 625 626**参数:** 627 628| 参数名 | 类型 | 必填 | 说明 | 629| -------- | -------- | -------- | -------- | 630| value | [ISendable](#isendable) \| null \| undefined | 是 | ISendable数据。| 631 632**返回值:** 633 634| 类型 | 说明 | 635| -------- | -------- | 636| string | 转换后的JSON字符串。| 637 638**示例:** 639 640```ts 641import { collections, lang, ArkTSUtils } from '@kit.ArkTS'; 642 643let arr = new collections.Array(1, 2, 3); 644let str = ArkTSUtils.ASON.stringify(arr); 645console.info(str); 646// 期望输出: '[1,2,3]' 647 648let map = new collections.Map<string, string>(); 649map.set("key1", "value1"); 650map.set("key2", "value2"); 651let str2 = ArkTSUtils.ASON.stringify(map); 652console.info(str2); 653// 期望输出: '{"key1":"value1","key2":"value2"}' 654 655let set = new Set<number>(); 656set.add(1); 657set.add(2); 658set.add(3); 659let str3 = ArkTSUtils.ASON.stringify(set as Object as lang.ISendable); 660console.info(str3); 661// 期望输出: '[1,2,3]' 662``` 663 664### isSendable 665 666isSendable(value: Object | null | undefined): boolean 667 668该方法用于判断value是否为Sendable数据类型。 669 670**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 671 672**系统能力:** SystemCapability.Utils.Lang 673 674**参数:** 675 676| 参数名 | 类型 | 必填 | 说明 | 677| -------- | -------- | -------- | -------- | 678| value | Object \| null \| undefined | 是 | 待校验的对象。| 679 680**返回值:** 681 682| 类型 | 说明 | 683| -------- | -------- | 684| boolean | value是否为Sendable数据类型,true表示value是Sendable数据类型,否则为false。| 685 686**示例:** 687 688```ts 689import { ArkTSUtils } from '@kit.ArkTS' 690 691@Sendable 692function sendableFunc() { 693 console.info("sendableFunc") 694} 695 696if (ArkTSUtils.isSendable(sendableFunc)) { 697 console.info("sendableFunc is Sendable"); 698} else { 699 console.info("sendableFunc is not Sendable"); 700} 701// 期望输出: 'SendableFunc is Sendable' 702``` 703