HarmonyOS鸿蒙Next中编译时class-transformer中@Type报错该如何解决

HarmonyOS鸿蒙Next中编译时class-transformer中@Type报错该如何解决

【问题现象】

在ArkTS中使用class-transformer库的@Type注解时,与ArkTS的V2版本状态管理中@Type的注解冲突,导致编译器代码检查不通过。

点击放大

【背景知识】

  1. 在ArkTS中,想要将从后端接收的JSON数据或者本地JSON数据转为明确的类结构,最常见的方法就是用as Class直接指定,但是这种写法有一个问题,就是as后的Class中类的方法丢失了,例如下面的代码,使用class中的isOk()方法时,会报错提示找不到该方法。

代码示例如下:

class DataBean {
  code = -1
  msg = ""

  isOk() {
    return this.code == 0
  }
}

let json = `{"code":0,"msg":"success"}`
let dataBean = JSON.parse(json) as DataBean
hilog.info(0xFF, "[class-transformer]", dataBean.msg) // success
hilog.info(0xFF, "[class-transformer]", `${dataBean.isOk()}`) // error 报错 isOk is not callable

这个主要是因为没有通过构造函数生成对象,用JSON.parse()获得的对象字面量没有对应的原型链,调用不了类方法。

  1. 出于上述原因,有开发者开发出了class-transformer工具库,并提供方法可以通过传入类的构造函数和对应的JSON数据直接构造出对应的类对象,在代码写法上比从JSON对象字面量取值后再去调用类的构造函数方便许多。在class-transformer库中,有个@Type注解用来处理类中的字段同时也是某些类的情况。

代码示例如下:

import { Type, plainToInstance } from 'class-transformer'
import 'reflect-metadata'
import { hilog } from '@kit.PerformanceAnalysisKit'

export class Bean {
  [@Type](/user/Type)(() => Data)
  data?: Data
}

export class Data {
  name?: string
  age?: number

  getName(): string | undefined {
    return this.name
  }
}

let json = '{"data":{"name":"张三","age":18}}'
let bean = plainToInstance(Bean, JSON.parse(json))
// bean.data就是一个实实在在的Data对象,可以调用getName()方法
hilog.info(0xFF, "[class-transformer]", '====' + bean.data?.getName()) // 张三

【定位思路】

由于语言框架提供的@Type注解开发者无法改动,只能从调用三方库的写法入手。通过在导入class-transformer的@Type注解时给其起个别名,就可以规避和V2版本状态管理中@Type注解冲突的问题。

【解决方案】

在代码中导入class-transformer的@Type注解时,给其另起个别名即可解决。

代码示例如下:

import { Type as ClzTransType } from 'class-transformer'
import 'reflect-metadata'; // 需要在ohpm中下载并引入该库,否则class-transformer的[@Type](/user/Type)会运行错误

class User {
  name: string = ''
}

class RUser {
  sex: number = 0

  @ClzTransType(() => User)
  user?: User
}

【总结】

当在代码中调用工具库遇到声明(包括变量、方法或者类等)与语言框架冲突时,可以在导入时通过给对应声明主体起别名来规避解决。


更多关于HarmonyOS鸿蒙Next中编译时class-transformer中@Type报错该如何解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中编译时class-transformer中@Type报错该如何解决的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在ArkTS中使用class-transformer库的@Type注解时

在ArkTS中使用class-transformer库的@Type注解时,与ArkTS的V2版本状态管理中@Type的注解冲突,导致编译器代码检查不通过。解决方案是在导入class-transformer的@Type注解时,给其另起个别名。例如:

import { Type as ClzTransType } from 'class-transformer';
import 'reflect-metadata';

class User {
  name: string = '';
}

class RUser {
  sex: number = 0;

  @ClzTransType(() => User)
  user?: User;
}

通过给@Type注解起别名ClzTransType,可以避免与ArkTS的@Type注解冲突。

回到顶部