2017-04-09 18 views
0

WebAssemblyのクロージャー・エクスターナルを作成しています。externsルール内の複数の関数シグネチャ

ファンクションWebAssembly.instantiateの場合、ファンクションシグネチャは2つあります。閉鎖外部宣言で両方のルールを宣言する方法

  • Promise<{module:WebAssembly.Module, instance:WebAssembly.Instance}> instantiate(BufferSource bytes [, importObject])
  • Promise<WebAssembly.Instance> instantiate(moduleObject [, importObject])

参考:

https://github.com/WebAssembly/design/blob/master/JS.md#webassemblyinstantiate

答えて

2

あなたは、引数と結果は、2つの異なる種類の労働組合であることを指定することができます。型の指定方法については、https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compilerを参照してください。ここで

は、このような機能の簡単な例である:あなたのWebAssembly.instantiate機能については

/** 
* @param {string|number} value 
* @return {string|number} 
*/ 
ambiguous = function(value) { 
    if (typeof value == 'string') { 
    return value+' is string'; 
    } else if (typeof value == 'number') { 
    return value+1; 
    } else throw new Error(); 
}; 

あなたはもちろん、文字列と数値よりも複雑なタイプがあります。私はあなたがPromise型をどのように指定するのか分からず、それらの構文を認識しないので、クロージャーコンパイラが現状をそのまま解析するのではないかと疑います。 externは次のようになります(Promisesの偽のタイプ)。

/** 
@param (!BufferSource|!WebAssembly.Module) arg1 either a BufferSource or a module 
@param Object= importObject optional object to import 
@return (!PromiseType1|!PromiseType2) 
*/ 
WebAssembly.instantiate = function(arg1, importObject) {}; 

!シンボルは、null以外のオブジェクトを示すために使用されます。これらがnullの場合は、そのままにしておいてください。 =シンボルの後には、Object=が定義されていないことを示します。

この機能の結果を使用する場合は、instanceofなどの方法を使用して、どのような種類のものをテストする必要があります。それ以外の場合、コンパイラは結果が2つの可能な型のうちの1つであることを認識します。 instanceofを使用しない場合は、型キャストを使用して、そのタイプがわかっていることをコンパイラーに伝えることができます。上記のページの最後を参照してください。

引数とその結果の両方に共用体型を持つ関数の例は、goog.array.findです。 source for goog.array.findが利用可能です。角括弧<>は、コンパイラのテンプレートタイプの機能に使用されています。

関連する問題