我有以下工作代码:
var routes = [];
javascript的Eclipse验证程序打印以下警告:
Type mismatch: cannot convert from any[] to any
我的空数组出了什么问题?
修改:警告稍后消失。显然Eclipse错了,问题需要关闭。对不起。
答案 0 :(得分:39)
您的JavaScript有效,问题在于Eclipse的JSDT插件。在最新版本中,他们引入了类型验证,这在许多情况下都存在问题 - 不仅适用于空数组(如您的情况)。另一个典型案例可能如下所示:a = b || c;
当b和c属于不同类型时(这是JavaScript的绝对有效代码),插件会抱怨。已经向JSDT开发人员报告了有关此问题的几个错误,但问题尚未解决。
不幸的是,目前无法使用Eclipse中的JSDT配置屏幕关闭类型验证。我直接从JSDT源代码中关闭它。为此,请按以下步骤操作:
org.eclipse.wst.jsdt.debug.core
项目。确保安装了Eclipse SDK。可能还需要调整plugin.xml
文件中的某些依赖项。computeSeverity
类的ProblemReporter
方法中。 case IProblem.TypeMismatch: return ProblemSeverities.Warning;
替换为case IProblem.TypeMismatch: return ProblemSeverities.Ignore;
org.eclipse.wst.jsdt.core<version>.jar
的文件 - 制作一份安全副本,然后打开jar文件并将ProblemReporter.class
文件替换为您在步骤5中编译的文件(文件为在项目的bin
文件夹中。)重要!确保您已下载了在Eclipse中使用的相同版本的JSDT。最终,您可以替换整个插件,而不是替换单个文件。
如果您不想自己下载和编译插件,可以尝试使用我的固定版本。我已将其放在我的FunctionSack网页上。我正在使用Eclipse 3.7(Indigo)和JSDT 1.3.0,所以如果你想使用我的文件,请确保你有类似的配置。
答案 1 :(得分:11)
eclipse的网络工具平台插件(wtp)包含一个JavaScript验证器,它对对象文字“{}”和数组文字“[]”符号有点过敏,它还会显示一些其他恼人的'问题',如'缺少分号'等。
我找到了最适合我的解决方案,我的神经是完全禁用wtp嵌入式JavaScript验证并使用第三方插件。 令人惊讶的是,禁用JavaScript验证器并不容易。每个eclipse版本都需要不同的方法,因此请尝试以下指南:
禁用wtp验证程序后,您可以尝试使用第三方工具,例如jsLint/jsHint
答案 2 :(得分:4)
正如我在目前的测试中观察到的那样,当您在一个函数中定义一个局部变量时会出现问题,该函数是一个跟随return
关键字的主体。此方案可以在以下示例中显示(假设代码位于顶级JavaScript文件中,表示不在任何模块/函数内,因此第一个a
在全局范围内定义):
var a=[]; //Global variable assignment, no warnings
function f1(){ //global function
var a=[]; //level 1 local variable, no warnings
return a;
}
function f2(){ //local functions and member functions
var f = function(){
var a=[]; // no warinings
return a;
};
this.f = function(){
var a=[]; //no warnings
return a;
};
return f; //returning a defined funciton is OK
}
function f3(){ //returning a function
return function(){
var a=[]; //warning: Type mismatch: cannot convert from any[] to any
return a;
};
}
因此解决方法很简单:将f3更改为
function f3(){ //returning a defined function
var f = function(){
var a=[]; //warning is gone!
return a;
};
return f;
}
答案 3 :(得分:2)
它是有效的Javascript(假设你不是在一些像表达式中间的某些奇怪的上下文中写的那样:P)所以要么“Eclipse的验证器”被破坏,要么你没有使用“Eclipse验证器” javascript“毕竟。
答案 4 :(得分:0)
这是完全有效的JS,听起来像Eclipse可能正在使用不正确的语法插件,或者某些东西......好吧......错了。
您可以尝试...
来确认var routes = [];
routes.push({ url: '/' });
console.log(routes.length);