2017-06-27 15 views
2

既存のjavascriptライブラリのscala.jsファサードを作成しようとしています。この1特定の関数のシグネチャは次のとおりです。複数の可能な戻り値の型を持つscala.jsファサードの作成

def something(command: String) = js.native 

今の問題は、実際のJavaScriptライブラリでは、この方法は、コマンドの一つの値の文字列を返し、コマンドの別の値のためのjQueryを返すということです。私はこのメソッドの戻り値の型を作るべきか分かりません。私はそれをjs.Anyとしておくことを考えていましたが、ユーザーはasInstanceOfを使ってそれぞれの型に変換する必要がありましたが、より良い方法で処理できると思います。

提案がありますか?

答えて

2

個人的には、私はおそらくこれを特殊文字列をラップするScalaの複数の強く型付けされた関数としてラップしています。

たとえば、Querkiのために作成したManifest facadeを参照してください。それは文字通りの呼び出しを記述する内部ファサードを持っています:

@js.native 
trait ManifestFacade extends js.Object { 
    @JSName("manifest") 
    def manifestInternal(cmd:String, params:js.Any*):Any = js.native 
} 

これはアプリケーションの使用を意図したものではありません。

class ManifestCommands(manifest:ManifestFacade) { 
    def manifestList():dom.Element = manifest.manifestInternal("list").asInstanceOf[dom.Element] 
    def manifestGetOptions():js.Dictionary[js.Any] = manifest.manifestInternal("option").asInstanceOf[js.Dictionary[js.Any]] 
    def manifestGetOption(name:String):Any = manifest.manifestInternal("option", name) 
} 

ManifestFacadeからManifestCommandsへの暗黙的な変換がある。その代わりに、例えば、より正確な関数とそのラッパー層が存在します。 (これは古いコードですが、最近では暗黙のクラスとしてManifestCommandsを暗黙のクラスとして記述しています)。

これは少し前の作業ですが、アプリケーションコードが心配することなく素敵で強く型付けされたレベルで動作することを可能にしますさまざまなコマンドが実際にボンネットの下で荒々しい多形関数を呼び出す方法です。

+0

ああ、私はあなたのファサードの別のものでこれを見て覚えています。あまりにも悪いことに、私は早くそれを選んでいませんでした。しかし、うん、これははるかに良いようです。まさに私が探していたもの。ありがとうございました –

関連する問題