加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala.js – 将case类转换为js.Object的最佳方法

发布时间:2020-12-16 08:55:27 所属栏目:安全 来源:网络整理
导读:说我有一个案例类: case class Name(first: String,last: String)val n1 = Name("John","Doe")val n2 = Name("Mary","Doe") 我有一个java脚本对象: @js.nativetrait MyJSObject extends js.Object { def add(name: js.Object): Unit = js.native } 这样的
说我有一个案例类:

case class Name(first: String,last: String)
val n1 = Name("John","Doe")
val n2 = Name("Mary","Doe")

我有一个java脚本对象:

@js.native
trait MyJSObject extends js.Object { 
  def add(name: js.Object): Unit = js.native 
}

这样的名称应该是格式

{"first":"John","last":"Doe"}

将我的case对象转换为js.Object的最佳方法是什么?

我知道这可以通过upickle.write()将其转换为json String来实现,所以我想我的问题是这是最好的方法吗?

解决方法

如果你控制case类,你可以只添加@JSExportAll注释:

@JSExportAll
case class Name(first: String,last: String)

这将创建名为first和last的属性.请注意,这与简单对象不同.但是,根据add方法的作用,它足够了(并且比转换为JSON并再次解析更轻量级).

如果您需要交叉编译案例类,可以在JVM项目中包含scalajs-stubs库.它将提供虚拟注释(不会写入.class文件).

如果需要js.Object,可以使用export typechecker:

val x = Name("foo","bar")
js.use(x).as[js.Object]

这甚至可以使用定义所需字段的特征:

@js.native
trait Options extends js.Object {
  def first: String = js.native
  def last: String = js.native
}

val x = Name("foo","bar")
js.use(x).as[Options]

如果类型之间存在不匹配,则js.use(x).as调用将失败(即,如果Options定义了Name未定义的字段).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读