@Type装饰器：标记类属性的类型
=================

为了实现序列化类时不丢失属性的复杂类型，开发者可以使用@Type装饰器装饰类属性。

@Type的目的是标记类属性，配合PersistenceV2使用，防止序列化时类丢失。在阅读本文档前，建议提前阅读：[PersistenceV2](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-persistencev2)。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a8/v3/A5gmZHRBRMOC4CxPQGjS6Q/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073258Z&HW-CC-Expire=86400&HW-CC-Sign=1E473EEDF76DA4169A2FFE556034EC827D38AA81C84AF47C9167660C1E2B7053)

@Type从API version 12开始支持。

从API version 12开始，该装饰器支持在元服务中使用。

#### 概述

@Type标记类属性，使得类属性序列化时不丢失类型信息，便于类的反序列化。

#### 装饰器说明

| @Type装饰器 | 说明 |
| :-- | :-- |
| 装饰器参数 | type：类型。 |
| 可装饰的类型 | Object class以及Array、Date、Map、Set等内嵌类型。 |

#### 使用限制

1.  只能用在[@ObservedV2](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-observedv2-and-trace)装饰的类中，不能用在自定义组件中。
    
    class Sample {
      private data: number = 0;
    }
    @ObservedV2
    class Info {
      @Type(Sample)
      @Trace public sample: Sample = new Sample(); // 正确用法
    }
    
     @Observed
     class Info2 {
       @Type(Sample)
       sample: Sample = new Sample(); // 错误用法，不能用在@Observed装饰的类中，编译时报错
     }
     @ComponentV2
     struct Index {
       @Type(Sample)
       sample: Sample = new Sample(); // 错误用法，不能用在自定义组件中，编译时报错
       build() {
       }
     }
    
2.  不支持collections.Set、collections.Map等类型。
    
3.  不支持非built-in类型。如[PixelMap](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-pixelmap)、NativePointer、[ArrayList](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-arraylist)等Native类型。
    
4.  不支持简单类型。如string、number、boolean等。
    
5.  不支持构造函数含参的类。
    

#### 使用场景

#### \[h2\]持久化数据

import { PersistenceV2, Type } from '@kit.ArkUI';

@ObservedV2
class SampleChild {
  @Trace childNumber: number = 1;
}

@ObservedV2
class Sample {
  // 对于复杂对象需要@Type修饰，确保反序列化成功，去掉@Type会反序列化值失败。
  @Type(SampleChild)
  // 对于没有初值的类属性，经过@Type修饰后，需要手动保存，否则持久化失败。
  // 无法使用@Type修饰的类属性，必须要有初值才能持久化。
  @Trace sampleChild?: SampleChild = undefined;
}

@Entry
@ComponentV2
struct TestCase {
  @Local sample: Sample = PersistenceV2.connect(Sample, () => new Sample)!;

  build() {
    Column() {
      Text('childNumber value:' + this.sample.sampleChild?.childNumber)
        .onClick(() => {
          this.sample.sampleChild = new SampleChild();
          this.sample.sampleChild.childNumber = 2;
          PersistenceV2.save(Sample);
        })
        .fontSize(30)
    }
  }
}