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

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

@Type的目的是标记类属性,配合PersistenceV2使用,防止序列化时类丢失。在阅读本文档前,建议提前阅读:PersistenceV2

说明:

@Type从API version 12开始支持。

概述

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

装饰器说明

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

使用限制

1、只能用在@ObservedV2装饰的类中,不能用在自定义组件中。

class Sample {
  data: number = 0;
}
@ObservedV2
class Info {
  @Type(Sample)
  @Trace 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、不支持非buildin类型,如PixelMap、NativePointer、ArrayList等Native类型。

4、不支持简单类型,如string、number、boolean等。

使用场景

持久化数据

数据页面

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

// 数据中心
@ObservedV2
class SampleChild {
  @Trace p1: number = 0;
  p2: number = 10;
}

@ObservedV2
export class Sample {
  // 对于复杂对象需要@Type修饰,确保序列化成功
  @Type(SampleChild)
  @Trace f: SampleChild = new SampleChild();
}

页面

import { PersistenceV2 } from '@kit.ArkUI';
import { Sample } from '../Sample';

@Entry
@ComponentV2
struct Page {
  prop: Sample = PersistenceV2.connect(Sample, () => new Sample())!;

  build() {
    Column() {
      Text(`Page1 add 1 to prop.p1: ${this.prop.f.p1}`)
        .fontSize(30)
        .onClick(() => {
          this.prop.f.p1++;
        })
    }
  }
}