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