HarmonyOS鸿蒙Next中编译时class-transformer中@Type报错该如何解决
HarmonyOS鸿蒙Next中编译时class-transformer中@Type报错该如何解决
【问题现象】
在ArkTS中使用class-transformer库的@Type注解时,与ArkTS的V2版本状态管理中@Type的注解冲突,导致编译器代码检查不通过。
【背景知识】
- 在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()获得的对象字面量没有对应的原型链,调用不了类方法。
- 出于上述原因,有开发者开发出了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
更多关于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;
}