Scala.js 将 Scala 函数转换为 JS 函数
Scala.js convert Scala function to JS function
我知道隐式转换可用于 js.FunctionN
<–> scala.FunctionN
。但是,如果我以动态方式(没有类型化外观)使用库,它们将无济于事,因为编译器显然不知道我需要转换。例如,如果 JS 代码需要一个带有字符串和函数的 JS 数组作为输入——类似于
['Hello world', function ($x, $y) {
console.log($x + $y)
}],
,我不能像这样在 Scala 中创建它:
val a: js.Array[Any] = js.Array(
"Hello world",
(x: Int, y: Int) => {console.log(x + y)}
)
)
因为Scala函数不会转为JS函数。是否存在一些明确的转换方法,类似于可变 Seq 的 toJSArray
?我检查过 asInstanceOf[js.Function]
不起作用。
asInstanceOf
不起作用,因为那基本上是在说 "this function is already a js.Function
",这是不正确的。但是如果你给它一个明确的类型归属,这通常会正确转换,就像这样(没有尝试编译但应该大致正确):
val a: js.Array[Any] = js.Array(
"Hello world",
{ (x: Int, y: Int) => {console.log(x + y)} }:js.Function2[Int, Int, Unit]
)
样板有点多,但这始终是没有外墙的代价...
我知道隐式转换可用于 js.FunctionN
<–> scala.FunctionN
。但是,如果我以动态方式(没有类型化外观)使用库,它们将无济于事,因为编译器显然不知道我需要转换。例如,如果 JS 代码需要一个带有字符串和函数的 JS 数组作为输入——类似于
['Hello world', function ($x, $y) {
console.log($x + $y)
}],
,我不能像这样在 Scala 中创建它:
val a: js.Array[Any] = js.Array(
"Hello world",
(x: Int, y: Int) => {console.log(x + y)}
)
)
因为Scala函数不会转为JS函数。是否存在一些明确的转换方法,类似于可变 Seq 的 toJSArray
?我检查过 asInstanceOf[js.Function]
不起作用。
asInstanceOf
不起作用,因为那基本上是在说 "this function is already a js.Function
",这是不正确的。但是如果你给它一个明确的类型归属,这通常会正确转换,就像这样(没有尝试编译但应该大致正确):
val a: js.Array[Any] = js.Array(
"Hello world",
{ (x: Int, y: Int) => {console.log(x + y)} }:js.Function2[Int, Int, Unit]
)
样板有点多,但这始终是没有外墙的代价...