Closure Compiler:避免"缺少return语句"保证退货时发出警告

时间:2015-07-02 09:29:32

标签: javascript return google-closure-compiler

此功能将始终返回"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() {
^

同样,此函数将始终返回一个字符串:

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

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

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

}

同样,编译器会发出有关"缺少return语句的警告。函数需要返回字符串。"

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

更新

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

正在寻找涉及修改JS源代码的解决方案 到"keep the compiler happy"

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

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

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

    var x = true;

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

}

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

4 个答案:

答案 0 :(得分:2)

Closure Compiler没有任何“提示”机制来修改控制流分析。您完全禁用警告组,@ Suppress注释或修改代码。

答案 1 :(得分:1)

只需使用变量来存储返回字符串,该字符串使用默认值进行初始化,这里是代码:

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

对于第二个函数,只需返回不需要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';
}

根据输入的bool参数直接返回结果,不带任何变量声明。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

您必须提供返回值。但是在你的代码中,返回值是有条件的,这就是你得到这个错误的原因。

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;
}