HarmonyOS 鸿蒙Next 为什么定义了类型,用instanceof判断类型时还是object?
HarmonyOS 鸿蒙Next 为什么定义了类型,用instanceof判断类型时还是object?
【前置】
1、动态类型语言(如ArkTS、 JavaScript、Python、Ruby)
在运行时才进行类型检查。这意味着变量的类型是在赋值时确定的,而不是在声明时确定的。因此,你可以在运行时改变变量的类型。
2、静态类型语言(如Java、C++、GO)
在编译时进行类型检查,变量的类型在声明时就已经确定,并且在程序运行过程中不能改变。
【分析】
示例
type Person = {
name: string;
age: number;
};
const person: Person = {
name: ‘Alice’,
age: 30,
};
if (person instanceof Object) {
console.log(‘person is an object’);
}
由于ArkTS属于动态类型语言,运行时类型信息丢失:编译后的 ArkTS 代码中,所有的类型信息都被移除了。运行时环境中没有 Person 这个类型的概念,只有对象。
可以结合class-transformer和reflect-metadata三方插件,可以参考如下代码
//ohpm install class-transformer
//ohpm install reflect-metadata
import ‘reflect-metadata’;
import { plainToClass, Type as Type2 } from ‘class-transformer’;
//1、接口返回的数据
interface IUser {
id:number;
name:string;
age:number
}
export default interface BaseResult<T> {
Code: number
Msg: string
Result?: T[]
Cryption: number
}
let Result:BaseResult<IUser> = {
Code: 200,
Msg: ‘success’,
Cryption: 0,
Result: [
{
id:1,
name:‘wangyiyi’,
age:18
},
{
id:2,
name:‘zhaoshiyi’,
age:20
},
]
}
//1、根据接口返回的数据做处理
@Observed
export class User{
id:number;
name:string;
age:number
constructor(id:number, name:string,age:number) {
this.id = id
this.name = name
this.age = age
}
}
class ResponseObj {
Code: number
Msg: string
Cryption: number
@Type2(() => User)
Result: User[] = [];
constructor(Code: number, Msg: string,Cryption:number, Result?: User[]) {
this.Code = Code
this.Msg = Msg
this.Cryption = Cryption
this.Result = Result as User[]
}
}
@Entry
@Component
struct Index {
@State message: string = ‘Hello World’;
@State list: User[] = [];
aboutToAppear(): void {
let ResultStr = JSON.stringify(Result) //接口返回的字符串
let jsonData: BaseResult<IUser> = JSON.parse(ResultStr)
let responseObj: ResponseObj = plainToClass(ResponseObj, jsonData);
console.log( <span class="hljs-number">00000000</span>--- ${<span class="hljs-built_in">JSON</span>.stringify(responseObj)}
)
this.list = this.list.concat(responseObj.Result);
}
build() {
Column() {
ForEach(this.list, (item: User, index: number) => {
ViewA({ item: item })
})
}
.height(‘100%’)
.width(‘100%’)
}
}
@Component
export struct ViewA {
@ObjectLink item: User
build() {
Row(){
Button(${<span class="hljs-keyword">this</span>.item.name}
).onClick(() =>{
this.item.name = this.item.name + ‘11’
})
}.margin({top : 10 })
}
}
在HarmonyOS鸿蒙Next的开发中,如果你在使用instanceof
关键字判断一个对象的类型时返回的是object
,这通常意味着你正在检查的对象在运行时被识别为Java的根类型Object
。这种情况可能由以下几个原因引起:
-
类型擦除:如果你在使用泛型或继承体系时遇到此问题,可能是因为Java的泛型类型擦除机制。泛型信息在编译时会被擦除,只保留原始类型
Object
。 -
动态类型:对象可能是在运行时通过反射或其他动态方式创建的,其实际类型没有在编译时被正确识别。
-
类加载问题:类加载器可能没有正确加载你期望的类,导致对象被视为
Object
。 -
代码错误:检查你的代码,确保你没有错误地将对象显式转换为
Object
,或者在判断前进行了不恰当的类型转换。
确保你检查的类已经正确导入,并且对象确实是你期望的类型实例。同时,验证你的编译和运行环境是否一致,以及是否有任何类加载器相关的特殊配置。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html