HarmonyOS鸿蒙Next中如何在类中默认添加属性且有值,但是又不用初始化它

HarmonyOS鸿蒙Next中如何在类中默认添加属性且有值,但是又不用初始化它

class UserInfo {
  name: string = ''
  age: number = 0
  isOk?: boolean = false
}

@Entry
@Component
struct Index {
  @State message: UserInfo[] = []
  aboutToAppear(): void {
    // 这里模拟接口过来的数据
    this.message = [
      { "name": "张三", "age": 25 },
      { "name": "李四", "age": 30 }
    ]
    // 如果类型上自己加的属性是可选的默认是会有添加这个属性
    console.info(JSON.stringify(this.message))

    // 这里循环加上了这个属性,但是如果数据大就不太适合
    for (let i = 0; i < this.message.length; i++) {
      this.message[i].isOk = false
    }
    console.info(JSON.stringify(this.message))
    
    // TODO:如何利用类默认就加上这个属性且有默认值
  }

  build() {
    Column().size({ width: '100%', height: '100%' })
  }
}

理想是不用循环


更多关于HarmonyOS鸿蒙Next中如何在类中默认添加属性且有值,但是又不用初始化它的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

尊敬的开发者,您好!

在ArkTS中,除了使用as进行类型转换外,可以通过三方库class-transformer实现更安全的类型转换方式实现类型安全校验。核心原理:通过装饰器声明类型映射关系,结合plainToInstance方法将JSON对象转换为真实的类实例对象,确保能调用类方法。实现步骤如下:

  1. 安装依赖: ohpm install class-transformer ohpm install reflect-metadata

  2. 定义实体类(使用装饰器标记嵌套类型):

    import { Type } from 'class-transformer';
    
    class Photo {
      id?: number;
      name?: string;
      // 类方法可安全调用
      getPhotoName(): string | undefined {
        return this.name?.replace('.png', '');
      }
    }
    
    class Album {
      id?: number;
      @Type(() => Photo) // 标记嵌套类型
      photos: Photo[] = [];
    }
    
  3. 安全类型转换:

    import { plainToInstance } from 'class-transformer';
    import { JSON } from '[@kit](/user/kit).ArkTS';
    
    const rawData: any = JSON.parse('{"photos":[{"id":1,"name":"sunset.png"}]}');
    // 关键转换方法
    const album = plainToInstance(Album, rawData); // 安全调用类方法
    if (album.photos?.getPhotoName()) {
      console.log(album.photos.getPhotoName()); // 输出:sunset
    }
    

更多关于HarmonyOS鸿蒙Next中如何在类中默认添加属性且有值,但是又不用初始化它的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个能满足家假设我接口数据只有两个属性,然后我类型自己加了一个,怎么将将接口数据复制,我写的三个类型的装死的变量上,处理我写的那种循环的办法,

这个能满足家假设我接口数据只有两个属性,然后我类型自己加了一个,怎么将将接口数据复制,我写的三个类型的装死的变量上,处理我写的那种循环的办法,

这个能满足假设我接口数据只有两个属性,然后我类型自己加了一个,怎么将接口数据赋值给,我写的三个类型的装饰的变量上,除了我写的那种循环的办法,

在HarmonyOS鸿蒙Next中,可通过@State@Provide@StorageLink装饰器在类中声明属性并赋予默认值,无需手动初始化。例如:

@Entry
@Component
struct MyComponent {
  @State message: string = 'Hello World'
  
  build() {
    // 直接使用已初始化的message属性
  }
}

使用装饰器会自动管理状态初始化,属性在组件实例化时即具备默认值。

在HarmonyOS Next中,可以通过构造函数或属性初始化器为类属性设置默认值,无需手动循环赋值。

对于ArkTS类,推荐以下两种方式:

  1. 使用构造函数初始化
class UserInfo {
  name: string = ''
  age: number = 0
  isOk: boolean = false
  
  constructor(data?: Partial<UserInfo>) {
    if (data) {
      Object.assign(this, data)
    }
  }
}
  1. 使用工厂方法
class UserInfo {
  name: string = ''
  age: number = 0
  isOk: boolean = false
  
  static create(data: Partial<UserInfo>): UserInfo {
    return Object.assign(new UserInfo(), data)
  }
}

使用示例:

aboutToAppear(): void {
  this.message = [
    new UserInfo({ "name": "张三", "age": 25 }),
    new UserInfo({ "name": "李四", "age": 30 })
  ]
  
  // 或者使用工厂方法
  this.message = [
    UserInfo.create({ "name": "张三", "age": 25 }),
    UserInfo.create({ "name": "李四", "age": 30 })
  ]
}

这样每个实例都会自动包含isOk: false默认值,无需循环处理。构造函数方式更符合ArkTS的类设计模式,能确保类型安全且代码简洁。

回到顶部