Javascript 闭包编译器:避免";“缺少返回语句”;保证退货时发出警告

Javascript 闭包编译器:避免";“缺少返回语句”;保证退货时发出警告,javascript,return,google-closure-compiler,Javascript,Return,Google Closure Compiler,此函数将始终返回“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 {boole

此函数将始终返回
“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';
    }

}
编译器再次发出关于“缺少返回语句。函数应返回字符串”的警告

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


更新 我应该说得更清楚,我正在寻找解决办法 只有包含“暗示”编译器。例如:使用合适的 或提供特定的 向编译器请求更改其流分析

我不是在寻找一个涉及修改JS源代码的解决方案 对

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

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

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

    var x = true;

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

}
编译器是否支持JSDoc标记,如
@alwaysreturns
,或其他类似的“暗示”机制
用于流量分析?可能是CLI标志?

只需使用一个变量来存储返回字符串,该字符串使用默认值初始化,下面是代码:

/**
 * @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
参数直接返回结果,无需任何变量声明。

您必须提供返回值。但在代码中,返回值是有条件的,这就是为什么会出现此错误

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。

闭包编译器没有任何“提示”机制来修改控制流分析。您必须完全禁用警告组、@suppress annotation或修改代码。

也许它希望您确保始终返回某些内容。代码在逻辑上总是返回字符串,但如果忽略逻辑,则开关不能有匹配的大小写=>no return,并且if表达式可能为false,跳过body=>no return。请尝试像这样注释内联返回
function/**number*/foo(x){return x-1;}
。这里的
number
是退货类型谢谢您的回答。我应该说得更清楚一点,我正在寻找一种只涉及“暗示”编译器的解决方案。我不是在寻找一种解决方案,它涉及修改JS源代码以“让编译器满意”。我为误会感到抱歉。我现在更新了我的问题。另外,我知道可以重构
convertBoolToString()
函数来删除
开关和
boolstring
,但这不是重点。函数的目的是演示由于编译器流分析的限制而导致“缺少返回语句”警告的情况。感谢您的回答,但我在问题中说:“我知道可以通过添加
@suppress{missingReturn}来抑制警告
,但我想知道是否有更好的解决方案。是否有“提示”可用于编译器的流分析?“您认为哪些“提示”不是@suppress且不涉及修改代码?“@suppress{missingReturn}”是“提示”。提示的目的是向编译器提供有用的信息,开发人员知道这些信息,但编译器不知道。例如,一个C开发人员知道某些函数将被频繁/很少调用,可以使用
hot
/
cold
来提示编译器的优化程序(请参阅:)
@suppress{missingReturn}
不是提示,因为它不会给编译器提供有用的信息。它不能帮助编译器理解总是返回值。闭包编译器支持一个提示:“在类型检查不能准确推断表达式类型的情况下,可以添加类型转换注释”()。此提示有助于编译器理解表达式的类型。我正在寻找一个提示,帮助编译器理解特定代码块将始终
返回
(或者特定条件将始终
为true
)。抱歉,没有此类提示。我可以想象,枚举一个开关的所有可能值作为一个“提示”是可能的,但这似乎并不普遍有用。您是否在其他语言或工具中看到了CFA“提示”,并发现这些提示很有用?
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;
}