外部规则中的多个功能签名

时间:2017-04-09 03:16:54

标签: google-closure-compiler webassembly

我正在为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

1 个答案:

答案 0 :(得分:2)

您可以指定参数和结果是两种不同类型的并集。有关如何指定类型的信息,请参阅https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler

以下是此类功能的简单示例:

/**
* @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();
};

对于WebAssembly.instantiate函数,您当然会有比字符串和数字更复杂的类型。我不知道你将如何指定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,则将其保留。 <{1}}之后的=符号表示它可以是未定义的。

使用此功能的结果时,您需要使用Object=或其他方法测试您获得的内容类型。否则编译器只知道结果是两种可能的类型之一。如果不使用instanceof,您可以使用类型转换告诉编译器您知道该类型是什么,请参阅上面引用的该页面的结尾。

来自closure-library的函数示例,其参数和结果都有goog.array.findsource for goog.array.find可用。请注意,尖括号instanceof用于编译器的模板类型功能。