Scala.js:对象字面值,键名中有冒号

Scala.js: object literal with keys having colons in their names

本文关键字:js 对象 字面值 Scala      更新时间:2023-09-26

我使用的Javascript库期望如下对象:

{
  "paren:action": ...
}

如您所见,键/属性的名称中有一个冒号,这就是我必须将名称放在引号中的原因。目前,我正在尝试使用Scala.js创建一个相同的对象:

@JSExport
def create() = {
  literal(`paren:action` = ...)
}

我已经使用了反引号,因为没有它们,它甚至无法编译。但是,结果对象的名称与预期的不一致。

示例(在Chrome控制台执行):

var a = { "paren:action": ... };
"paren:action" in a; // => true
Object.keys(a); // => ["paren:action"]
var b = ScalaJsApp().create();
"paren:action" in b; // => false
Object.keys(b); // => ["paren$colonaction"]

我该如何解决这个问题?

解决这个问题最简单的方法是使用js.Dictionary:

def create() = {
  js.Dictionary("paren:action" -> ...)
}

这当然也应该与literal一起工作,但没有,由于讨厌的编译器内部细节:paren$colonaction是Scala编译器内部如何表示paren:action的名称,主要是由于JVM字节码中允许的字符的限制。