关键字
JSON.parse / 类型检查转换 / 反射 / 图片资源 / 代理 / proxy / Reflect / reviver
问题描述
A类型的b属性为number,但是在JSON.parse + as 之后可以赋值为任何类型,那么对属性b的操作结果便无法保证。
interface A { a:number, b:number, c?:string } let a:A={ a:1, b:2, } let d = JSON.parse('{"a":1,"b":"2","d":["a","b"]}') as A let e = d.b + 1; console.log("e=",String(e)) // "21" console.log(JSON.stringify(d))
let h = JSON.parse('{"a":1,"b":"ab","d":["a","b"]}') as A let i = h.b / 1; console.log("i=",String(i)) // NaN console.log(JSON.stringify(h))
// 输出结果 e= "21" {"a":1,"b":"2","d":["a","b"]} i= NaN {"a":1,"b":"ab","d":["a","b"]}
问题1:如何对JSON.parse做通用的类型检查转换?
问题2:是否有反射机制去获取类以及类实例的属性方法等?
问题3:是否有方法给对象和方法提供代理,类似ES6中的Proxy和Reflect?
解决方案
-
JSON.parse处理可以使用reviver,示例如下:
class Dead { name:string = '' age: string = '' gender?:string } let god:Dead = new Dead() // JSON.parse 是根据给定的字符串json化,然后返回结果的, 与指定的变量类型无关 god = JSON.parse('{"name":"zzzz","xiaoming": {"name":"XXX","age":18}}', (key:string,value: string | Number): void| string| Number => { // 将"age":18 转化成"age":"18" if (key == 'age' && typeof value == 'number') { value = value.toString() } return value }) console.log('== ' + god.age)
-
提供了反射能力。
-
Reflect支持Reflect.get、Reflect.has、Reflect.ownKeys、Reflect.set,使用方法与ES6相同。示例如下:
class MyClass { value:number = 9; fun() { console.log('fun print') } } function TestFun(par:number) { console.log('TestFun print, par:'+ par) } let aClass = new MyClass(); Reflect.set(aClass, "key", "keyvalue"); let str:string = Reflect.get(aClass, "key"); console.log(str) Reflect.set(aClass, "keyFun", () => { console.log('lan print.') }); let lanFun: Function = Reflect.get(aClass, "keyFun"); lanFun(); Reflect.set(aClass, "keyFun2", TestFun); let globeFun: Function = Reflect.get(aClass, "keyFun2"); globeFun(4); Reflect.set(aClass, "keyFun3", aClass.fun); let classFun: Function = Reflect.get(aClass, "keyFun3");classFun();
-
此外可以使用动态import特性实现部分反射功能。参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-dynamic-import-0000001826481108
-
-
当前ArkTS不支持proxy。如果用JSON做转换的话可以加reviver函数,或者利用三方库Reflect-metadata、class Transform来实现。