2016-09-04 1 views
0

그렇다면 어떻게 될까요?JavaScript에서 사용하기 위해 ScalaJS에서 유형 안전 라이브러리를 만들 수 있습니까?

@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입니다. 나는 때문에, 잘, 스칼라 자동 마술을 제공하기 전에 생각하지 않았다, 그래서 이것은 단지 첫 번째 시도에서 일했다 :

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

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

질문은 :

하나에 가정되는 방법 (적어도 컴파일 타임에는 동적 검사 필요 없음) 스칼라의 일반적인 기능 (예 : 정수, 배열, 함수, 제네릭 및 ClassTag)을 ScalaJS에서 사용하고 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가 (즉, 거기에 아무것도하는 것은 정의되지 않은 동작입니다) 자바 스크립트에서 스칼라/자바 스타일의 배열과 불투명하다. js.Array은 JavaScript에서 실제로 사용할 수있는 JavaScript 배열입니다. 대부분의 Scala 컬렉션과 마찬가지로 ClassTag을 생성 할 필요가 없습니다.

+0

저는 ScalaJS에 익숙하지 않아서 자동으로 호환되는 부분과 약간 다르게 처리해야하는 부분을 정말로 모릅니다. 고맙습니다. 솔루션이 잘 작동합니다. – monnef

+0

직접 호환되는 제품과 호환되지 않는 제품은 https://www.scala-js.org/doc/interoperability/types.html에 문서화되어 있습니다. – sjrd

관련 문제