【问题标题】:Interop between js and scala functions in Scala.jsScala.js 中 js 和 scala 函数之间的互操作
【发布时间】:2015-04-18 02:36:23
【问题描述】:

我正在尝试为我的库Paths.js 编写一个类型化的外观,遵循official guide

根据 Sebastien 在Typed façade for JS library in Scala.js 中的建议,我能够充实 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 => Doubleaccessor 转换为js.Function1[js.Any, Double],我的尝试看起来像(使用Function1js.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[js.Any, Double]js.Function1[A, Double] 不是你想要的。然后A => Double 将简单地隐式转换为js.Function1[A, Double]
  • 是的,我实际上想要js.Function1[A, Double]。但是底层的本地方法不知道类型。我们可以将多态方法声明为原生方法吗?
  • 我已经尝试过,到目前为止,我发现在定义扩展 js.Object 的多态特征时没有问​​题,具有多态本机方法。这会产生意想不到的副作用吗?
  • 不,那是有用的。它甚至在 the doc 的某个地方有记录:“JS 特征及其方法可以具有类型参数、抽象类型成员和类型别名,与 Scala 的类型系统相比没有限制。”
  • 太棒了!我快完成了:-)

标签: scala scala.js


【解决方案1】:

在 cmets 中继续讨论:

在这种情况下,使用js.Function1[A, Double] 是完全有效和合理的。

正如@sjrd 引用的Scala.js doc

JS trait 及其方法可以有类型参数、抽象类型成员和类型别名,与 Scala 的类型系统相比没有限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 2014-07-24
    • 2023-03-02
    • 2010-10-24
    • 2011-10-26
    • 2011-03-16
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多