动态类型发现在谷歌闭包编译器



有时我遇到的情况是,我有一个未知类型的JavaScript对象。然后在脚本中执行类型检查,并根据检测到的类型调用适当的函数。例如:像这样

/**
 * @param {!Array} aArray my array
 */
function actOnArray(aArray) {
}
/**
 * @param {*} aObject an arbitrary object
 */ 
function doSomething(aObject) {
  // make sure we have an array
  if ((null != aObject) && Array.isArray(aObject)) {
    actOnArray(aObject);
  }
}

在google闭包编译器中通过高级编译运行这个代码片段会产生以下警告消息:

JSC_TYPE_MISMATCH: actual parameter 1 of actOnArray does not match formal parameter
found   : *
required: Array at line 14 character 15
    actOnArray(aObject);

这个警告是有意义的,因为编译器不知道我的类型检查的语义。

我的问题是:我如何注释代码来告诉编译器,在某一点上我已经获得了关于类型的信息。在这个例子中,我想在if块中告诉,我现在确定知道aObject参数的类型是!Array.

对于某些模式,编译器可以在测试中自动收紧类型:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @warning_level VERBOSE
// ==/ClosureCompiler==

/** @param {*} data */
function log(data) {
  if (data && data instanceof Array) {
    logArray(data);
  } else {
    console.log(data);
  }
}
/** @param {!Array} data */
function logArray(data) {
  for(var i = 0; i < data.length; i++) {
    log(data[i]);
  }
}
log([1, 2, 3]);

然而,在许多情况下它不能。在这些情况下,您需要键入强制转换:

actOnArray(/** @type {!Array} */ (aObject));

注意额外的括号-它们是必需的

最新更新