Closure 编译器:在保证 return 时避免 "missing return statement" 警告

Closure Compiler: Avoid "missing return statement" warning when a return is guaranteed

此函数将始终return "foobar":

/**
 * @return {string}
 */
function foobar() {

    var x = true;

    if (x) {
        return 'foobar';
    }

}

使用此命令编译时:

java -jar compiler-20150609.jar --js test.js --warning_level VERBOSE

发出此警告:

test.js:4: WARNING - Missing return statement. Function expected to return string.
function foobar() {
^

同样,这个函数总是return一个字符串:

/**
 * @param  {boolean} bool
 * @return {string}
 */
function convertBoolToString(bool) {

    var boolstring = bool ? 'true' : 'false';

    switch (boolstring) {
        case 'true':
            return 'yes';
        case 'false':
            return 'no';
    }

}

再次,编译器发出关于 "Missing return statement. Function expected to return string."

的警告

我知道可以通过添加 @suppress {missingReturn} 来抑制警告,但我想知道是否有 更好的解决方案。有没有可以提供编译器流分析的"hint"?也许是什么 类似于 type cast (这在类型检查不能准确推断表达式类型的情况下很有用)?


更新

我应该更清楚地表明我正在寻找解决方案 其中 涉及 "hinting" 编译器。例如:使用合适的 JSDoc tag 或提供特定的 CLI flag 编译器更改其流分析。

不是寻找涉及修改 JS 源代码的解决方案 至 "keep the compiler happy".

@chsdk方案的缺点是return变量必须是 用正确类型的虚拟值初始化。如果 return 类型是 class instance, 然后必须创建一个虚拟实例,并且构造函数可能需要参数,这些参数也必须被赋予虚拟值。 在我看来,这是一个 code smell:return 变量的虚拟值 永远不会被使用,它实际上是一个不相关问题的解决方法(编译器警告)。

我正在寻找这样的解决方案:

/**
 * @return {string}
 */
function foobar() {

    var x = true;

    /** @alwaysreturns */
    if (x) {
        return 'foobar';
    }

}

编译器是否支持 JSDoc 标签,例如 @alwaysreturns,或其他类似的 "hinting" 机制 用于流量分析?也许是 CLI 标志?

简单的用一个变量来存储return字符串,用默认值初始化,代码如下:

/**
 * @return {string}
 */
function foobar() {
   var myReturn = "default";
   var x = true;
    if (x) {
        myReturn = 'foobar';
    }
    return myReturn;
}

对于第二个函数 return 你不需要 switch 语句的字符串:

/**
 * @param  {boolean} bool
 * @return {string}
 */
function convertBoolToString(bool) {
    var boolstring = bool ? 'true' : 'false';
    return boolstring;
}

甚至更好:

/**
 * @param  {boolean} bool
 * @return {string}
 */
function convertBoolToString(bool) {         
    return bool ? 'true' : 'false';
}

直接return根据输入的bool参数得到结果,无需任何变量声明。

您必须提供 return 值。但是在您的代码中 return 值是有条件的,这就是您收到此错误的原因。

function foobar() {
    var returnValue = "default"
    var x = true;

    if (x) {
        returnValue =  'foobar';
    }

    return returnValue;

}

function convertBoolToString(bool) {
    var returnValue = "default";
    var boolstring = bool ? 'true' : 'false';

    switch (boolstring) {
        case 'true':
            returnValue = 'yes';
        case 'false':
            returnValue = 'no';
    }
    return returnValue;
}

将@suppress {missingReturn} 添加到函数 JSDoc。

Closure 编译器没有任何 "hint" 机制来修改控制流分析。您被完全禁用警告组、@suppress 注释或修改代码所困。