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

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

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

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


person Aaron Yodaiken    schedule 12.07.2011    source источник
comment
Я думаю, что вы идете на это в противоположном направлении. Проверка типов — это функция процесса компиляции компилятора. Он предназначен для облегчения компиляции и не предназначен для автономного использования, поскольку во многом зависит от функций компилятора. Однако вам не нужно использовать библиотеку Closure для использования компилятора.   -  person Stephen Chung    schedule 14.07.2011
comment
Я это знаю — вот почему я ищу альтернативы.   -  person Aaron Yodaiken    schedule 14.07.2011
comment
Ну, есть что-то под названием Closure-Linter, которое может делать то, что вы хотите...   -  person Stephen Chung    schedule 14.07.2011
comment
Что делает компилятор, чтобы нельзя было просто игнорировать выходной файл?   -  person John    schedule 21.12.2011
comment
@luxun Ваш сайт очень похож на мой.   -  person Engineer    schedule 23.10.2012
comment
Я нашел функцию Javascript, которая может проверять типы аргументов функции: stackoverflow.com/a/13926334/975097   -  person Anderson Green    schedule 18.12.2012
comment
Я повторяю комментарий Джона. Используйте компилятор Closure с предупреждениями SIMPLE_OPTIMZIATIONS и VERBOSE и игнорируйте выходной файл.   -  person Chad Killingsworth    schedule 15.05.2013
comment
@StephenChung Основное преимущество проверки типов заключается в раннем обнаружении основных ошибок. Языки из семейства ML и его производных (OCaml, SML, F#, Haskell) выводят типы, т. е. программисту не нужно указывать тип переменных. Другими словами, компилятор работает на программиста, а не наоборот.   -  person Martin Jambon    schedule 05.01.2014


Ответы (3)


Существует Doctor JS, проект Mozilla, который в первую очередь (насколько я понимаю) выполняет проверку типов для JS. .

person gsnedders    schedule 13.07.2011
comment
Это кажется полезным, хотя, насколько я понимаю, нет способа запустить это напрямую из командной строки (например, для использования внутри скрипта сборки/тестирования). Есть ли такой способ доступа? - person Aaron Yodaiken; 13.07.2011
comment
Я попробовал это на одном из своих скриптов, и это не сработало - сказал, что это не работает. Затем попробовал это на очень коротком сценарии, и это сработало, поэтому я не знаю, работает ли оно на больших сценариях, есть ли в нем ошибки или что-то еще. - person jfriend00; 13.07.2011
comment
Он доступен на Github, поэтому вы можете попробовать установить и запустить его локально. - person Tikhon Jelvis; 14.01.2012

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

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

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

person Chris Moschini    schedule 19.10.2011

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

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

person wesen    schedule 14.01.2012