我尝试导出用于JavaScript的算法的Scala实现。我正在使用@JSExport
。该算法适用于interoperability guide中标记为 opaque 的Scala Char
和Long
值。
我想知道(a)这意味着什么; (b)处理此问题的建议是什么。
我认为这意味着我应该避免Char
和Long
并使用String
加上运行时检查长度(或者使用无形Sized
集合)而Int
代替。
但欢迎其他想法。
更多细节......
我正在查看的代码类型是:
@JSExport("Foo")
class Foo(val x: Int) {
@JSExport("add")
def add(n: Int): Int = x+n
}
...正常工作:new Foo(1).add(2)
生成3
。
使用Long
相同的通话报告替换类型:
java.lang.ClassCastException: 1 is not an instance of scala.scalajs.runtime.RuntimeLong
(与使用和返回Char
的方法类似的东西。)
答案 0 :(得分:9)
不透明意味着
@JSExport
ed构造函数)@JSExport
ed方法和字段外)仍然可以从Scala.js代码接收该类型的值,传递它,并将其返回给Scala.js代码。也始终可以致电.toString()
,因为java.lang.Object.toString()
是@JSExport
。除toString()
外,Char
和Long
都不会导出任何内容,因此您无法对其进行任何操作。
因此,正如您所经历的那样,JavaScript 1
不能用作Scala.js Long
,因为它不是正确的类型。 'a'
无效Char
(但它是有效的String
)。
因此,正如您自己推断的那样,您必须确实避免使用opaque类型,如果需要从JavaScript创建/操作它们,请使用其他类型。 Scala.js可以使用该语言中的标准工具来回转换,例如someChar.toInt
和someInt.toChar
。
选择哪种类型最好取决于您的应用。对于Char
,可以是Int
或String
。对于Long
,如果可能的值从不使用超过52位的精度,则它可以是String
,一对Int
,甚至可能是Double
。