Подтвердить что ты не робот

Каково текущее состояние проверки статического типа JavaScript?

Я знаю, что компилятор Google Closure выполняет проверку типов, но есть ли какие-либо альтернативы, предпочтительно, которые не так тесно связаны с библиотекой и оптимизатором?

Если нет, есть ли способ, чтобы компилятор Google Closure выполнял только статический анализ?

(По статическому анализу здесь я имею в виду такие вещи, как определение типов для аргументов и т.д., которые я могу выполнить через что-то, чтобы дать мне предупреждения, если я сделаю опечатку или передаю неправильный тип.)

4b9b3361

Ответ 1

Там Доктор JS, который является проектом Mozilla, который в основном (как я понимаю, по крайней мере) выполняет проверку типов для JS.

Ответ 2

Microsoft AJAX Minifier немного более расслаблен в отношении того, какую сумму вы должны сделать, чтобы сделать JS файл, чтобы получить полезные результаты. Вы можете запустить его с настройками по умолчанию и получить файл с высокой степенью минимизации, который по-прежнему работает с внешним кодом: http://ajaxmin.codeplex.com/

Но, как Closure Compiler, так и Ajax Minifier могут делать очень ограниченный статический анализ за пределами основной линии, из-за того, как разработан Javascript. Доступ к необъявленному свойству может быть проверен только на undefined, присвоение необъявленной переменной просто означает объявление ее в глобальной области, присвоение объекта переменной, содержащей число, является законным и т.д. В JS существует много законов, которые типичный язык (Java, С#) учитывает границы, поэтому без объявления типов, границ и ожиданий для конкретного компилятора, к сожалению, вы ограничены в тех ошибках, которые вы можете предотвратить.

Я бы немного интересовался тем, что может трансформироваться между большими 2 (MS и Google). Это было бы полезно для поддержки IDE, тестирования размера кода с расширенными оптимизациями и т.д.

Ответ 3

Я был доволен редактором intellij idea/webstorms, который анализирует jsdoc и делает свой собственный статический анализ для определения потенциальных или фактических ошибок безопасности типа. Это оказалось весьма полезным, хотя потребуется немного работы, чтобы получить наследование для работы с некоторыми общими структурами. Из-за множества подходов, доступных с помощью прототипного наследования javascript, компилятор нуждается в немного большей помощи, чем для других языков.

Это коммерческий инструмент, но я могу использовать его для java, php, javascript, python и ruby ​​проектов, все с довольно приличным статическим анализом и помощниками рефакторинга. Я делал много с emacs и запускал node.js процессы для компилятора jshint и закрытия, но это намного менее хрупкое.