【HarmonyOS NEXT】是否支持对JSON.parse做通用的类型检查转换

关键字

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?

解决方案
  1. 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)

  2. 提供了反射能力。

    • 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

  3. 当前ArkTS不支持proxy。如果用JSON做转换的话可以加reviver函数,或者利用三方库Reflect-metadata、class Transform来实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值