2016-09-04 30 views
0

如果是這樣怎麼樣?在我的最後一個問題,我問爲什麼這個片段崩潰:ScalaJS中使用JavaScript創建類型安全的庫是否可用?

@JSExport("Test") object TestScalaJs { 
    @JSExport def callMe[A: ClassTag](f: js.Function1[Int, A]): Array[A] = Array(f(4)) 
} 

上:

var res = Test().callMe(function(x) {return x + 'x';}); 
console.log('TestScalaJs:', res.join(', ')); 

有:

$c_jl_Throwable.fillInStackTrace__jl_Throwable @ VM153:4161 
$c_sjsr_UndefinedBehaviorError.fillInStackTrace__jl_Throwable @ VM153:9241 
$c_jl_Throwable.init___T__jl_Throwable @ VM153:4177 
$c_sjsr_UndefinedBehaviorError.init___T__jl_Throwable @ VM153:9248 
$c_sjsr_UndefinedBehaviorError.init___jl_Throwable @ VM153:9244 
$throwClassCastException @ VM153:196 
$as_s_reflect_ClassTag @ VM153:7824 
$c_LTestScalaJs$.callMe @ VM153:2061 
(anonymous function) @ VM155:2 
$s_Lscalatags_jsdom_Frag$class__applyTo__Lscalatags_jsdom_Frag__Lorg_scalajs_dom_raw_Element__V @ VM153:1108 
$c_Lscalatags_JsDom$TypedTag.applyTo__O__V @ VM153:9981 
$c_Lfiddle_Fiddle$.println__sc_Seq__V @ VM153:2113 
$c_LScalaFiddle$.init___ @ VM153:2021 
$m_LScalaFiddle$ @ VM153:2034 
(anonymous function) @ VM154:1 
(anonymous function) @ VM77 resultframe?theme=light:32 

,人們的響應,這是因爲我缺少的隱含參數爲callMe。我沒想到的是,因爲,Scala是它提供自動神奇地過,所以這只是工作的第一次嘗試:

object TestVanilla { 
    def callMe[A: ClassTag](f: Int => A): Array[A] = Array(f(4)) 
} 

val res = TestVanilla.callMe(_ + "x"); 
println(res.mkString(", ")); 

的問題是:

一個應該是怎樣編寫類型安全的(至少在編譯時,不需要動態檢查)使用ScalaJS中的普通功能(如整數,數組,函數,泛型和ClassTag我真的很希望這是可能的。

*:我的意思是像沒有神祕的要求,如從JavaScript手動構建ClassTag

回答

1

你可能想在你的榜樣使用js.Array

@JSExport("Test") object TestScalaJs { 
    @JSExport def callMe[A](f: js.Function1[Int, A]): js.Array[A] = js.Array(f(4)) 
} 

Array是斯卡拉/ Java的風格數組和不透明從JavaScript(即在其上做任何事情是不確定的行爲)。 A js.Array是JavaScript實際可以使用的JavaScript數組。像大多數Scala系列一樣,它不需要構建ClassTag

+0

我是ScalaJS的新手,所以我真的不知道什麼是自動兼容的,需要對待什麼有點不同。謝謝你,你的解決方案運作良好。 – monnef

+0

在https://www.scala-js.org/doc/interoperability/types.html記錄什麼是和不是直接兼容的 – sjrd

相關問題