• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.arkui.StateManagement (状态管理)
2
3状态管理模块提供了应用程序的数据存储能力、持久化数据管理能力、UIAbility数据存储能力和应用程序需要的环境状态、工具。
4
5>**说明:**
6>
7>本模块首批接口从API version 12开始支持,后续版本的新增接口,采用上角标单独标记接口的起始版本。
8
9
10本文中T和S的含义如下:
11
12
13| 类型   | 说明                                     |
14| ---- | -------------------------------------- |
15| T    | Class,number,boolean,string和这些类型的数组形式。 |
16| S    | number,boolean,string。                 |
17
18
19## 导入模块
20
21```ts
22import { AppStorageV2,PersistenceV2,UIUtils} from '@kit.ArkUI';
23```
24
25## AppStorageV2
26
27AppStorageV2具体UI使用说明,详见[AppStorageV2(应用全局的UI状态存储)](../../ui/state-management/arkts-new-appstoragev2.md)。
28
29**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
30
31**系统能力:** SystemCapability.ArkUI.ArkUI.Full
32
33### connect
34
35static&nbsp;connect\<T extends object\>( </br >
36  &nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;TypeConstructorWithArgs\<T\>, </br >
37  &nbsp;&nbsp;&nbsp;&nbsp;keyOrDefaultCreator?:&nbsp;string&nbsp;|&nbsp;StorageDefaultCreator\<T\>, </br >
38  &nbsp;&nbsp;&nbsp;&nbsp;defaultCreator?:&nbsp;StorageDefaultCreator\<T\> </br >
39):&nbsp;T&nbsp;|&nbsp;undefined
40
41将键值对数据储存在应用内存中。如果给定的key已经存在于[AppStorageV2](../../ui/state-management/arkts-new-appstoragev2.md)中,返回对应的值;否则,通过获取默认值的构造器构造默认值,并返回。
42
43**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
44
45**系统能力:** SystemCapability.ArkUI.ArkUI.Full
46
47**参数:**
48
49| 参数名   | 类型   | 必填 | 说明               |
50| -------- | ------ | ---- | ---------------------- |
51| type | [TypeConstructorWithArgs\<T\>](#typeconstructorwithargst) | 是   | 指定的类型,若未指定key,则使用type的name作为key。 |
52| keyOrDefaultCreator | string&nbsp;\|&nbsp;[StorageDefaultCreator\<T\>](#storagedefaultcreatort) | 否   | 指定的key,或者是获取默认值的构造器。 |
53| defaultCreator | StorageDefaultCreator\<T\> | 否   | 获取默认值的构造器。 |
54
55>**说明:**
56>
57>1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器;
58>
59>2、确保数据已经存储在AppStorageV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常;
60>
61>3、同一个key,connect不同类型的数据会导致应用异常,应用需要确保类型匹配;
62>
63>4、key建议使用有意义的值,长度不超过255,使用非法字符或空字符的行为是未定义的。
64
65**返回值:**
66
67| 类型                                   | 说明                                                         |
68| -------------------------------------- | ------------------------------------------------------------ |
69| T | 创建或获取AppStorageV2数据成功时,返回数据;否则返回undefined。 |
70
71**示例:**
72
73```ts
74import { AppStorageV2 } from '@kit.ArkUI';
75
76@ObservedV2
77class SampleClass {
78  @Trace p: number = 0;
79}
80
81// 将key为SampleClass、value为new SampleClass()对象的键值对存储到内存中,并赋值给as1
82const as1: SampleClass | undefined = AppStorageV2.connect(SampleClass, () => new SampleClass());
83
84// 将key为key_as2、value为new SampleClass()对象的键值对存储到内存中,并赋值给as2
85const as2: SampleClass = AppStorageV2.connect(SampleClass, 'key_as2', () => new SampleClass())!;
86
87// key为SampleClass已经在AppStorageV2中,将key为SampleClass的值返回给as3
88const as3: SampleClass = AppStorageV2.connect(SampleClass) as SampleClass;
89```
90
91### remove
92
93static&nbsp;remove\<T\>(keyOrType:&nbsp;string&nbsp;|&nbsp;TypeConstructorWithArgs\<T\>):&nbsp;void
94
95将指定的键值对数据从[AppStorageV2](../../ui/state-management/arkts-new-appstoragev2.md)里面删除。如果指定的键值不存在于AppStorageV2中,将删除失败。
96
97**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
98
99**系统能力:** SystemCapability.ArkUI.ArkUI.Full
100
101**参数:**
102
103| 参数名   | 类型   | 必填 | 说明               |
104| -------- | ------ | ---- | ---------------------- |
105| keyOrType | string \| TypeConstructorWithArgs\<T\> | 是   | 需要删除的key;如果指定的是type类型,删除的key为type的name。 |
106
107>**说明:**
108>
109>删除AppStorageV2中不存在的key会报警告。
110
111
112**示例:**
113
114<!--code_no_check-->
115```ts
116// 假设AppStorageV2中存在key为key_as2的键,从AppStorageV2中删除该键值对数据
117AppStorageV2.remove('key_as2');
118
119// 假设AppStorageV2中存在key为SampleClass的键,从AppStorageV2中删除该键值对数据
120AppStorageV2.remove(SampleClass);
121
122// 假设AppStorageV2中不存在key为key_as1的键,报警告
123AppStorageV2.remove('key_as1');
124```
125
126### keys
127
128static&nbsp;keys():&nbsp;Array\<string\>
129
130获取[AppStorageV2](../../ui/state-management/arkts-new-appstoragev2.md)中的所有key。
131
132**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
133
134**系统能力:** SystemCapability.ArkUI.ArkUI.Full
135
136**返回值:**
137
138| 类型                                   | 说明                                                         |
139| -------------------------------------- | ------------------------------------------------------------ |
140| Array\<string\> | 所有AppStorageV2中的key。 |
141
142>**说明:**
143>
144>key在Array中的顺序是无序的,与key插入到AppStorageV2中的顺序无关。
145
146**示例:**
147
148```ts
149// 假设AppStorageV2中存在两个key(key_as1、key_as2),返回[key_as1、key_as2]赋值给keys
150const keys: Array<string> = AppStorageV2.keys();
151```
152
153
154
155## PersistenceV2
156
157继承自[AppStorageV2](#appstoragev2),PersistenceV2具体UI使用说明,详见[PersistenceV2(持久化存储UI状态)](../../ui/state-management/arkts-new-persistencev2.md)。
158
159**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
160
161**系统能力:** SystemCapability.ArkUI.ArkUI.Full
162
163### globalConnect<sup>18+</sup>
164
165static globalConnect\<T extends object\>(type: ConnectOptions\<T\>): T | undefined
166
167将键值对数据储存在应用磁盘中。如果给定的key已经存在于[PersistenceV2](../../ui/state-management/arkts-new-persistencev2.md)中,返回对应的值;否则,会通过获取默认值的构造器构造默认值,并返回。如果globalConnect的是\@ObservedV2对象,该对象\@Trace属性的变化,会触发整个关联对象的自动刷新;非\@Trace属性变化则不会,如有必要,可调用PersistenceV2.save接口手动存储。
168
169**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
170
171**系统能力:** SystemCapability.ArkUI.ArkUI.Full
172
173| 名称   |类型   |必填   | 说明                                                      |
174| ------------- | ------------|-------------------|-------------------------- |
175| type    |[ConnectOptions\<T\>](#connectoptions18)    |是  |传入的connect参数,详细说明见ConnectOptions参数说明。 |
176
177**返回值:**
178
179|类型   |说明                 |
180|----------|-----------------------------------|
181|T \| undefined    |创建或获取数据成功时,返回数据;否则返回undefined。    |
182
183> **说明:**
184>
185> 1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器(第二个参数非法也使用第三个参数作为默认构造器)。
186>
187> 2、确保数据已经存储在PersistenceV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常。
188>
189> 3、同一个key,globalConnect不同类型的数据会导致应用异常,应用需要确保类型匹配。
190>
191> 4、key建议使用有意义的值,可由字母、数字、下划线组成,长度不超过255,使用非法字符或空字符的行为是未定义的。
192>
193> 5、关联[\@Observed](../../ui/state-management/arkts-observed-and-objectlink.md)对象时,因为该类型的name属性未定义,需要指定key或者自定义name属性。
194>
195> 6、数据的存储路径为应用级别,不同module使用相同的key和相同的加密分区进行globalConnect,存储的数据副本应用仅有一份。
196>
197> 7、globalConnect使用同一个key但设置了不同的加密级别,数据为第一个使用globalConnect的加密级别,并且PersistenceV2中的数据也会存入最先使用key的加密级别。
198>
199> 8、connect和globalConnect不建议混用,因为数据副本路径不同,如果混用,则key不可以一样,否则会crash。
200>
201> 9、EL5加密要想生效,需要开发者在module.json中配置字段ohos.permission.PROTECT_SCREEN_LOCK_DATA,使用说明见[声明权限](../../security/AccessToken/declare-permissions.md)。
202
203**示例:**
204
205<!--code_no_check-->
206```ts
207import { PersistenceV2, Type, ConnectOptions } from '@kit.ArkUI';
208import { contextConstant } from '@kit.AbilityKit';
209
210@ObservedV2
211class SampleChild {
212  @Trace childId: number = 0;
213  groupId: number = 1;
214}
215
216@ObservedV2
217export class Sample {
218  // 对于复杂对象需要@Type修饰,确保序列化成功
219  @Type(SampleChild)
220  @Trace father: SampleChild = new SampleChild();
221}
222
223// key不传入尝试用为type的name作为key,加密参数不传入默认加密等级为EL2
224@Local p: Sample = PersistenceV2.globalConnect({type: Sample, defaultCreator:() => new Sample()})!;
225
226// 使用key:global1连接,传入加密等级为EL1
227@Local p1: Sample = PersistenceV2.globalConnect({type: Sample, key:'global1', defaultCreator:() => new Sample(), areaMode: contextConstant.AreaMode.EL1})!;
228
229// 使用key:global2连接,使用构造函数形式,加密参数不传入默认加密等级为EL2
230@Local p2: Sample = PersistenceV2.globalConnect({type: Sample, key: 'global2', defaultCreator:() => new Sample()})!;
231
232// 使用key:global3连接,直接写加密数值,范围只能在0-4,否则运行会crash,例如加密设置为EL3
233@Local p3: Sample = PersistenceV2.globalConnect({type: Sample, key:'global3', defaultCreator:() => new Sample(), areaMode: 3})!;
234
235```
236
237### save
238
239static&nbsp;save\<T\>(keyOrType:&nbsp;string&nbsp;|&nbsp;TypeConstructorWithArgs\<T\>):&nbsp;void
240
241将指定的键值对数据持久化一次。
242
243**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
244
245**系统能力:** SystemCapability.ArkUI.ArkUI.Full
246
247**参数:**
248
249| 参数名   | 类型   | 必填 | 说明               |
250| -------- | ------ | ---- | ---------------------- |
251| keyOrType | string \| TypeConstructorWithArgs\<T\> | 是   | 需要持久化的key;如果指定的是type类型,持久化的key为type的name。 |
252
253>**说明:**
254>
255>由于非[\@Trace](../../ui/state-management/arkts-new-observedV2-and-trace.md)的数据改变不会触发[PersistenceV2](../../ui/state-management/arkts-new-persistencev2.md)的自动持久化,如有必要,可调用该接口持久化对应key的数据。
256>
257>手动持久化当前内存中不处于connect状态的key是无意义的。
258
259**示例:**
260
261<!--code_no_check-->
262
263```ts
264// 假设PersistenceV2中存在key为key_as2的键,持久化该键值对数据
265PersistenceV2.save('key_as2');
266
267// 假设PersistenceV2中存在key为SampleClass的键,持久化该键值对数据
268PersistenceV2.remove(SampleClass);
269
270// 假设PersistenceV2中不存在key为key_as1的键,无意义的操作
271PersistenceV2.remove('key_as1');
272```
273
274### notifyOnError
275
276static notifyOnError(callback: PersistenceErrorCallback | undefined): void
277
278在持久化失败时调用。
279
280**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
281
282**系统能力:** SystemCapability.ArkUI.ArkUI.Full
283
284**参数:**
285
286| 参数名   | 类型   | 必填 | 说明               |
287| -------- | ------ | ---- | ---------------------- |
288| callback | PersistenceErrorCallback \| undefined  | 是   | 持久化失败时调用。 |
289
290**示例:**
291
292```ts
293// 持久化失败时调用
294PersistenceV2.notifyOnError((key: string, reason: string, msg: string) => {
295  console.error(`error key: ${key}, reason: ${reason}, message: ${msg}`);
296});
297```
298
299## ConnectOptions<sup>18+</sup>
300
301**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
302
303**系统能力:** SystemCapability.ArkUI.ArkUI.Full
304
305|名称   |类型    |只读   |可选    |说明      |
306|--------|------------|------------|-----------|--------------|
307|type        | TypeConstructorWithArgs\<T\>   |否   |否   |指定的类型。         |
308|key         | string   |否   |是   |传入的key,不传则使用type的名字作为key。             |
309|defaultCreator   | StorageDefaultCreator\<T\>   |否   |是   |默认数据的构造器,建议传递,如果globalConnect是第一次连接key,不传会报错。 |
310|areaMode      | contextConstant.AreaMode   |否   |是    |加密级别:EL1-EL5,详见[加密级别](../../application-models/application-context-stage.md#获取和修改加密分区),对应数值:0-4,不传时默认为EL2,不同加密级别对应不同的加密分区,即不同的存储路径,传入的加密等级数值不在0-4会直接运行crash。 |
311
312## UIUtils
313
314UIUtils提供一些方法,用于处理状态管理相关的数据转换。
315
316**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
317
318**系统能力:** SystemCapability.ArkUI.ArkUI.Full
319
320### getTarget
321
322static getTarget\<T extends object\>(source: T): T
323
324从状态管理框架包裹的代理对象中获取原始对象。详见[getTarget接口:获取状态管理框架代理前的原始对象](../../ui/state-management/arkts-new-getTarget.md)。
325
326**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
327
328**系统能力:** SystemCapability.ArkUI.ArkUI.Full
329
330**参数:**
331
332| 参数名 | 类型 | 必填 | 说明     |
333| ------ | ---- | ---- | ------------ |
334| source | T    | 是   | 数据源对象。 |
335
336**返回值:**
337
338| 类型 | 说明                                             |
339| ---- | ------------------------------------------------ |
340| T    | 数据源对象去除状态管理框架所加代理后的原始对象。 |
341
342**示例:**
343
344```ts
345import { UIUtils } from '@kit.ArkUI';
346class NonObservedClass {
347  name: string = "Tom";
348}
349let nonObservedClass: NonObservedClass = new NonObservedClass();
350@Entry
351@Component
352struct Index {
353  @State someClass: NonObservedClass = nonObservedClass;
354  build() {
355    Column() {
356      Text(`this.someClass === nonObservedClass: ${this.someClass === nonObservedClass}`) // false
357      Text(`UIUtils.getTarget(this.someClass) === nonObservedClass: ${UIUtils.getTarget(this.someClass) ===
358        nonObservedClass}`) // true
359    }
360  }
361}
362```
363### makeObserved
364
365static makeObserved\<T extends object\>(source: T): T
366
367将普通不可观察数据变为可观察数据。详见[makeObserved接口:将非观察数据变为可观察数据](../../ui/state-management/arkts-new-makeObserved.md)。
368
369**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
370
371**系统能力:** SystemCapability.ArkUI.ArkUI.Full
372
373**参数:**
374
375| 参数名 | 类型 | 必填 | 说明     |
376| ------ | ---- | ---- | ------------ |
377| source | T    | 是   | 数据源对象。支持非@Observed和@ObserveV2修饰的class,JSON.parse返回的Object和@Sendable修饰的class。</br>支持Array、Map、Set和Date。</br>支持collection.Array, collection.Setcollection.Map。</br>具体使用规则,详见[makeObserved接口:将非观察数据变为可观察数据](../../ui/state-management/arkts-new-makeObserved.md)。 |
378
379**返回值:**
380
381| 类型 | 说明                                             |
382| ---- | ------------------------------------------------ |
383| T    | 可观察的数据。 |
384
385**示例:**
386
387```ts
388import { UIUtils } from '@kit.ArkUI';
389class NonObservedClass {
390  name: string = 'Tom';
391}
392
393@Entry
394@ComponentV2
395struct Index {
396  observedClass: NonObservedClass = UIUtils.makeObserved(new NonObservedClass());
397  nonObservedClass: NonObservedClass = new NonObservedClass();
398  build() {
399    Column() {
400      Text(`observedClass: ${this.observedClass.name}`)
401        .onClick(() => {
402          this.observedClass.name = 'Jane'; // 刷新
403        })
404      Text(`observedClass: ${this.nonObservedClass.name}`)
405        .onClick(() => {
406          this.nonObservedClass.name = 'Jane'; // 不刷新
407        })
408    }
409  }
410}
411```
412
413## StorageDefaultCreator\<T\>
414
415type StorageDefaultCreator\<T\> = () => T
416
417返回默认构造器的函数。
418
419**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
420
421**系统能力:** SystemCapability.ArkUI.ArkUI.Full
422
423**返回值:**
424
425| 类型 | 说明                                             |
426| ---- | ------------------------------------------------ |
427| () => T    | 返回默认构造器的函数。 |
428
429**示例:**
430
431```ts
432import { PersistenceV2 } from '@kit.ArkUI';
433
434@ObservedV2
435class SampleClass {
436  @Trace id: number = 0;
437  count: number = 1;
438}
439
440@ObservedV2
441class FatherSampleClass {
442  @Trace sampleClass: SampleClass = new SampleClass();
443}
444
445// 将key为SampleClass、value为new SampleClass()对象的键值对持久化,并赋值给source
446// StorageDefaultCreator 指的是 () => new FatherSampleClass()
447const source: FatherSampleClass | undefined = PersistenceV2.connect(FatherSampleClass, () => new FatherSampleClass());
448
449@Entry
450@Component
451struct SampleComp {
452  data: FatherSampleClass | undefined = source;
453
454  build() {
455    Column() {
456      Text(`${this.data?.sampleClass.id}`)
457    }
458  }
459}
460```
461
462## TypeConstructorWithArgs\<T\>
463
464含有任意入参的类构造器。
465
466**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
467
468**系统能力:** SystemCapability.ArkUI.ArkUI.Full
469
470### new
471
472new(...args: any): T
473
474**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
475
476**系统能力:** SystemCapability.ArkUI.ArkUI.Full
477
478**参数:**
479
480| 参数名 | 类型 | 必填 | 说明     |
481| ------ | ---- | ---- | ------------ |
482| ...args | any    | 是   | 函数入参。   |
483
484**返回值:**
485
486| 类型 | 说明                                             |
487| ---- | ------------------------------------------------ |
488| T    | T类型的实例。 |
489
490**示例:**
491
492```ts
493import { PersistenceV2 } from '@kit.ArkUI';
494
495@ObservedV2
496  // TypeConstructorWithArgs 指的是 SampleClass
497class SampleClass {
498  @Trace id: number = 0;
499  count: number = 1;
500}
501
502@ObservedV2
503class FatherSampleClass {
504  @Trace sampleClass: SampleClass = new SampleClass();
505}
506
507// 将key为SampleClass、value为new SampleClass()对象的键值对持久化,并赋值给source
508const source: FatherSampleClass | undefined = PersistenceV2.connect(FatherSampleClass, () => new FatherSampleClass());
509
510@Entry
511@Component
512struct SampleComp {
513  data: FatherSampleClass | undefined = source;
514
515  build() {
516    Column() {
517      Text(`${this.data?.sampleClass.id}`)
518    }
519  }
520}
521```
522
523## PersistenceErrorCallback
524
525type PersistenceErrorCallback = (key: string, reason: 'quota' | 'serialization' | 'unknown', message: string) => void
526
527持久化失败时返回错误原因的回调。
528
529**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
530
531**系统能力:** SystemCapability.ArkUI.ArkUI.Full
532
533**参数:**
534
535| 参数名 | 类型 | 必填 | 说明     |
536| ------ | ---- | ---- | ------------ |
537| key | string    | 是   | 出错的键值。   |
538|reason| 'quota' \| 'serialization' \| 'unknown'    | 是   | 出错的原因类型。   |
539| message | string    | 是   | 出错的更多消息。   |
540
541**示例:**
542
543```ts
544import { PersistenceV2, Type } from '@kit.ArkUI';
545
546@ObservedV2
547class SampleChild {
548  @Trace id: number = 0;
549  count: number = 10;
550}
551
552@ObservedV2
553export class Sample {
554  // 对于复杂对象需要@Type修饰,确保序列化成功
555  @Type(SampleChild)
556  @Trace sampleChild: SampleChild = new SampleChild();
557}
558
559// 接受序列化失败的回调
560// PersistenceErrorCallback 指的是 (key: string, reason: string, msg: string) => {console.error(`error key: ${key}, reason: ${reason}, message: ${msg}`);}
561PersistenceV2.notifyOnError((key: string, reason: string, msg: string) => {
562  console.error(`error key: ${key}, reason: ${reason}, message: ${msg}`);
563});
564
565@Entry
566@ComponentV2
567struct Index {
568  // 在PersistenceV2中创建一个key为Sample的键值对(如果存在,则返回PersistenceV2中的数据),并且和data关联
569  // 对于需要换connect对象的data属性,需要加@Local修饰(不建议对属性换connect的对象)
570  @Local data: Sample = PersistenceV2.connect(Sample, () => new Sample())!;
571  pageStack: NavPathStack = new NavPathStack();
572
573  build() {
574    Text(`Index add 1 to data.id: ${this.data.sampleChild.id}`)
575      .fontSize(30)
576      .onClick(() => {
577        this.data.sampleChild.id++;
578      })
579  }
580}
581```
582
583## TypeConstructor\<T\>
584
585类构造函数。
586
587**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
588
589**系统能力:** SystemCapability.ArkUI.ArkUI.Full
590
591### new
592
593new(): T
594
595**返回值:**
596
597| 类型 | 说明                                             |
598| ---- | ------------------------------------------------ |
599| T    | T类型的实例。 |
600
601**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
602
603**系统能力:** SystemCapability.ArkUI.ArkUI.Full
604
605**示例:**
606
607```ts
608import { PersistenceV2, Type } from '@kit.ArkUI';
609
610@ObservedV2
611class SampleChild {
612  @Trace id: number = 0;
613  count: number = 10;
614}
615
616@ObservedV2
617export class Sample {
618  // 对于复杂对象需要@Type修饰,确保序列化成功
619  // TypeConstructor 指的是 SampleChild
620  @Type(SampleChild)
621  @Trace sampleChild: SampleChild = new SampleChild();
622}
623
624@Entry
625@ComponentV2
626struct Index {
627  data: Sample = PersistenceV2.connect(Sample, () => new Sample())!;
628
629  build() {
630    Column() {
631      Text(`Index add 1 to data.id: ${this.data.sampleChild.id}`)
632        .fontSize(30)
633        .onClick(() => {
634          this.data.sampleChild.id++;
635        })
636    }
637  }
638}
639```
640
641## TypeDecorator
642
643type TypeDecorator = \<T\>(type: TypeConstructor\<T\>) => PropertyDecorator
644
645属性装饰器。
646
647**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
648
649**系统能力:** SystemCapability.ArkUI.ArkUI.Full
650
651**参数:**
652
653| 参数名 | 类型 | 必填 | 说明     |
654| ------ | ---- | ---- | ------------ |
655| type | [TypeConstructor\<T\>](#typeconstructort)    | 是   | 标记类属性的类型。   |
656
657**返回值:**
658
659| 类型 | 说明                                             |
660| ---- | ------------------------------------------------ |
661| PropertyDecorator    | 属性装饰器。 |
662
663**示例:**
664
665```ts
666import { PersistenceV2, Type } from '@kit.ArkUI';
667
668@ObservedV2
669class SampleChild {
670  @Trace id: number = 0;
671  count: number = 10;
672}
673
674@ObservedV2
675export class Sample {
676  // 对于复杂对象需要@Type修饰,确保序列化成功
677  // TypeDecorator 指的是 @Type
678  @Type(SampleChild)
679  @Trace sampleChild: SampleChild = new SampleChild();
680}
681
682@Entry
683@ComponentV2
684struct Index {
685  data: Sample = PersistenceV2.connect(Sample, () => new Sample())!;
686
687  build() {
688    Column() {
689      Text(`Index add 1 to data.id: ${this.data.sampleChild.id}`)
690        .fontSize(30)
691        .onClick(() => {
692          this.data.sampleChild.id++;
693        })
694    }
695  }
696}
697```
698