此功能将始终返回"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标志?
答案 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;
}