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 注释或修改代码所困。
此函数将始终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 注释或修改代码所困。