Scala.js 中 js 和 scala 函数之间的互操作
Interop between js and scala functions in Scala.js
我正在尝试为我的图书馆编写类型化外观 Paths.js, following the official guide。
根据塞巴斯蒂安在 中的建议,我充实了 API 的一部分。我现在缺少的是一种处理 API 中公开的转换函数的方法。基本上,这个库可以让你写类似
的东西
var pie = Pie({
data: [
{ name: 'Italy', population: 59859996 },
{ name: 'Mexico', population: 118395054 },
{ name: 'France', population: 65806000 }
],
accessor: function(x) { return x.population; },
center: [20, 15],
r: 30,
R: 50
});
想法是 - 为了简化客户端代码 - 该库不需要您将数据转换为适合绘图的形式。相反,您可以以您认为合适的形式提供数据列表,然后传递 accessor
函数以从原始数据中提取数字。这也使得将路径对象与原始数据相关联变得更加容易。
我想在 Scala 端公开的签名如下所示:
object Pie {
type Point = (Double, Double)
def apply(data: Seq[A],
accessor: A => Double,
center: Point, r: Double, R: Double)
}
我正在尝试将类型为 A => Double
的 accessor
转换为类似 js.Function1[js.Any, Double]
的类型,我的尝试看起来像(使用 Function1
和 Function1
之间的隐式转换js.Function1
)
val f: js.Any => Double = x => x match {
case _: A => accessor(x)
case _ => ???
}
这给了我一个警告 abstract type pattern A is unchecked since it is eliminated by erasure
。
翻译这个 API 的更好方法是什么?
要在评论中恢复讨论:
在这种情况下使用 js.Function1[A, Double]
是完全有效和合理的。
正如@sjrd 引用自 Scala.js doc:
JS traits and their methods can have type parameters, abstract type members and type aliases, without restriction compared to Scala's type system.
我正在尝试为我的图书馆编写类型化外观 Paths.js, following the official guide。
根据塞巴斯蒂安在
var pie = Pie({
data: [
{ name: 'Italy', population: 59859996 },
{ name: 'Mexico', population: 118395054 },
{ name: 'France', population: 65806000 }
],
accessor: function(x) { return x.population; },
center: [20, 15],
r: 30,
R: 50
});
想法是 - 为了简化客户端代码 - 该库不需要您将数据转换为适合绘图的形式。相反,您可以以您认为合适的形式提供数据列表,然后传递 accessor
函数以从原始数据中提取数字。这也使得将路径对象与原始数据相关联变得更加容易。
我想在 Scala 端公开的签名如下所示:
object Pie {
type Point = (Double, Double)
def apply(data: Seq[A],
accessor: A => Double,
center: Point, r: Double, R: Double)
}
我正在尝试将类型为 A => Double
的 accessor
转换为类似 js.Function1[js.Any, Double]
的类型,我的尝试看起来像(使用 Function1
和 Function1
之间的隐式转换js.Function1
)
val f: js.Any => Double = x => x match {
case _: A => accessor(x)
case _ => ???
}
这给了我一个警告 abstract type pattern A is unchecked since it is eliminated by erasure
。
翻译这个 API 的更好方法是什么?
要在评论中恢复讨论:
在这种情况下使用 js.Function1[A, Double]
是完全有效和合理的。
正如@sjrd 引用自 Scala.js doc:
JS traits and their methods can have type parameters, abstract type members and type aliases, without restriction compared to Scala's type system.