为什么在Scala.js中使用Double来表示不“需要”Double的属性?

时间:2017-05-03 17:58:43

标签: scala scala.js

我正在查看Screen类(包org.scalajs.dom.raw)并注意到以下属性:

def width: Double = js.native

def availHeight: Double = js.native

def height: Double = js.native

使用Double代替Int是否有任何理由?我不熟悉Scala.js代码,但对我来说使用Int会更有意义。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:6)

有时,似乎总是整数的东西实际上可以采用非整数值,正如@Bob Dalgleish所解释的那样。

还有一些情况是使用Double,因为值可能大于2 ^ 31。虽然是整个值,但它们超出了Int的范围,必须键入DoubleLong是不透明的,因此,不是JS数字的有效表示。)

但是,很多时候Scala.js外观类型(特别是对于DOM)使用Double只是因为它们是从TypeScript类型定义转换而来的,它只有number个。 Double是保守的近似值。在这些情况下,在验证原始规范(通常在Web IDL中)之后,我们可以将其缩小到Int(PR欢迎,并附带Web IDL规范的链接)。

您提到的Screen属性的具体情况属于最后一类。从the original IDL可以看出,这些值被描述为“long”。在IDL中,a long is an integer in the range [-2^31, 2^31-1],这正是Scala.js中Int的范围。