Javascript array: почему это недействительно?
У меня есть следующий рабочий код:
var routes = [];
Eclipse validator для javascript печатает следующее предупреждение:
Type mismatch: cannot convert from any[] to any
Что не так с моим пустым массивом?
Изменить: предупреждение исчезло позже. По-видимому, Eclipse ошибался, и вопрос должен быть закрыт. Извините.
Ответы
Ответ 1
Ваш JavaScript действителен, проблема связана с плагином JSDT для Eclipse. В последней версии они вводили проверку типов, что во многих ситуациях проблематично - не только для пустых массивов (например, в вашем случае). Другой типичный случай может выглядеть так: a = b || c;
Плагин будет жаловаться, когда b и c имеют разные типы (что является абсолютно допустимым кодом для JavaScript). Об этой проблеме уже сообщается разработчикам JSDT об ошибках, но проблемы еще не исправлены.
К сожалению, в настоящее время невозможно отключить проверку типа с помощью экрана конфигурации JSDT в Eclipse. Я отключил его непосредственно из исходного кода JSDT. Для этого выполните следующие действия:
- Загрузите исходный код JSDT из Проект Eclipse WebTools
- Откройте проект
org.eclipse.wst.jsdt.debug.core
с помощью Eclipse. Убедитесь, что у вас установлен Eclipse SDK. Также может потребоваться настроить некоторые зависимости в файле plugin.xml
.
- Проверка типа находится в
computeSeverity
методе класса ProblemReporter
.
- Чтобы отключить проверку типа, замените строку:
case IProblem.TypeMismatch: return ProblemSeverities.Warning;
на case IProblem.TypeMismatch: return ProblemSeverities.Ignore;
- Создайте проект и закройте Eclipse.
- В папке Eclipse найдите файл с именем
org.eclipse.wst.jsdt.core<version>.jar
- сделайте безопасную копию, затем откройте файл jar и замените файл ProblemReporter.class
на тот, который вы скомпилировали на шаге 5 (файл находится в bin
папку вашего проекта).
- Запустите Eclipse и очистите свой проект JavaScript. Все проверки типов будут игнорироваться JSDT.
Внимание! Убедитесь, что вы загрузили ту же версию JSDT, которую вы используете в Eclipse. В конце концов вместо замены одного файла вы можете заменить весь плагин.
Если вы не хотите загружать и компилировать плагин самостоятельно, вы можете попробовать с моей установленной версией. Я разместил его на веб-странице FunctionSack. Я использую Eclipse 3.7 (Indigo) с JSDT 1.3.0, поэтому убедитесь, что у вас есть аналогичная конфигурация, если вы хотите использовать мой файл.
Ответ 2
Плагин платформы веб-инструментов eclipse (wtp) включает в себя проверку подлинности JavaScript, которая несколько аллергия на литералы литерала "{}" и "literal" [] ", также обнаруживает некоторые другие раздражающие" проблемы ", такие как" "точка с запятой" и т.д.
Я нашел лучшее решение для меня, и для моих нервов - полностью отключить встроенную проверку подлинности JavaScript и использовать сторонний подключаемый модуль.
Удивительно, но это не так просто отключить JavaScript validator. Для каждой версии eclipse требуется другой подход, поэтому попробуйте следующее руководство:
- В Eclipse до версии 3.6 можно было отключить javascript
проверка через
'Window- > Настройки- > JavaScript- > Validator- > Ошибки/Предупреждения → []
Включить JavaScript-семантическую проверку "- но это не кажется
работа в 3.7 Indigo см. ошибка затмения
- В версии 3.7 Indigo try Project → Свойства → Строители → [] JavaScript Validator
- Если это не помогает, попробуйте Project → Properties → JavaScript → Include Path → Source → Excluded → Edit → Шаблоны исключений → Изменить → */
- Если ничего выше не помогает, откройте файл .project и удалите/закомментируйте "<nature> org.eclipse.wst.jsdt.core.jsNature </nature> " линия
После отключения валидатора wtp вы можете попробовать использовать сторонний инструмент, например jsLint/jsHint
Ответ 3
Как я уже отмечал в своем тестировании, проблема возникает, когда вы определяете локальную переменную в функции, тело которой следует за ключевым словом 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;
}
Ответ 4
Это действительный Javascript (если вы не пишете его в каком-то странном контексте, например, в середине выражения: P), так что либо "Eclipse validator for javascript" сломан, либо вы не используете "Eclipse validator for javascript".
Ответ 5
Это вполне допустимый JS и звучит так, как Eclipse может использовать неправильный плагин синтаксиса или что-то... ну... неправильно.
Вы можете подтвердить это, пытаясь...
var routes = [];
routes.push({ url: '/' });
console.log(routes.length);