Объявление и проверка типов в примерах
Google Closure Compiler, как и любой кошерный компилятор, старается проверить правильность кода и предупредить о возможных ошибках.
Первым делом он, разумеется, проверяет структуру кода и сразу же выдает такие ошибки как пропущенная скобка или лишняя запятая.
Но, кроме этого, он умеет проверять типы переменных, используя как свои собственные знания о встроенных javascript-функциях и преобразованиях типов,
так и информацию о типах из JSDoc, указываемую javascript-разработчиком.
Это обеспечивает то, чем так гордятся компилируемые языки - статическую проверку типов, что позволяет избежать лишних ошибок во время выполнения.
Для включения проверки типов используется флаг --check_types . Кроме того, --warning_level не должен быть QUIET , иначе вы не увидите предупреждений.
Самый очевидный способ задать тип - это использовать аннотацию. Полный список аннотаций вы найдете в документации.
В следующем примере параметр id функции f1 присваивается переменной boolVar другого типа:
/** @param {number} id */
function f1(id) {
/** @type {boolean} */
var boolVar
boolVar = id // (!)
}
Компиляция с флагом --check_types выдаст ошибку:
d.js:6: WARNING - assignment
found : number
required: boolean
boolVar = id
^
Действительно: произошло присвоение значения типа number переменной типа boolean .
Еще пример, на этот раз вызов функции с некорректным параметром:
/** @param {number} id */
function f1(id) {
f2(id) // (!)
}
/** @param {string} id */
function f2(id) { }
Такой функции приведет к ошибке:
f.js:3: WARNING - actual parameter 1 of f2 does not match formal parameter
found : number
required: string
f2(id)
^
Действительно, вызов функции f2 произошел с числовым типом вместо строки.
Кстати, по этому примеру видно, что тип переменной сохраняется после возврата из функции и других аналогичных операций.
Это возможно, благодаря графу взаимодействий и выведению (infer) типов, которое осуществляет компилятор.
Google Closure Compiler знает, как операторы javascript преобразуют типы. Такой код уже не выдаст ошибку:
/** @param {number} id */
function f1(id) {
/** @type {boolean} */
var boolVar
boolVar = !!id
}
Действительно - переменная преобразована к типу boolean двойным оператором НЕ.
А код boolVar = 'test-'+id выдаст ошибку, т.к. конкатенация со строкой дает тип string .
Google Closure Compiler содержит описания большинства встроенных объектов и функций javascript вместе с типами параметров и результатов.
Например, объектный тип Node соответствует узлу DOM.
Пример проверки:
/** @param {Node} node */
function removeNode(node) {
node.parentNode.removeChild(node)
}
document.onclick = function() {
removeNode("123")
}
Выдаст
script.js:6: WARNING - actual parameter 1 of removeNode does not match formal parameter
found : string
required: (Node|null)
removeNode("123")
Обратите внимание - в этом примере компилятор выдает required: Node|null . Это потому, что указание объектного типа (не элементарного) подразумевает, что в функцию может быть передан null .
В следующем примере тип указан жестко, без возможности обнуления.
Пример: Объект не-null
/** @param {!Node} node */
function removeNode(node) {
node.parentNode.removeChild(node)
}
document.onclick = function() {
removeNode("123")
}
Выдаст
script.js:3: WARNING - actual parameter 1 of Node.prototype.removeChild does not match formal parameter
found : (Node|string)
required: (Node|null)
node.parentNode.removeChild(node)
^
Найти описания встроенных типов и объектов javascript вы можете в файле экстернов: externs.zip находится в корне архива compiler.jar , или в соответствующей директории SVN: http://closure-compiler.googlecode.com/svn/trunk/externs/.
В Google Closure Library есть функции проверки типов: goog.isArray , goog.isDef , goog.isNumber и т.п.
Google Closure Compiler знает о них и понимает, что внутри следующего if переменная может быть только функцией:
if (goog.isFunction(f)) {
f.apply(1,2,3)
}
Выдаст следующую ошибку:
d.js:2: WARNING - Function Function.apply: called with 3 argument(s). Function requires at least 0 argument(s) and no mo
re than 2 argument(s).
f.apply(1,2,3)
^
То есть, компилятор увидел, что f - это функция, то есть объект типа Function . Метод apply для экземпляра такого объекта принимает только 2 аргумента - обнаружена ошибка. Хорошо, что сейчас, а не позже, в момент запуска.
Из нескольких примеров, которые мы рассмотрели, должна быть понятна общая логика проверки типов.
Соответствующие различным типам и ограничениям на типы аннотации вы можете найти в Документации Google. В частности, возможно указание нескольких возможных типов, типа undefined и т.п.
Также можно указывать количество и тип параметров функции, ключевого слова this , объявлять классы, приватные методы и интерфейсы.
Проверка типов javascript, предоставляемая Google Closure Compiler - пожалуй, самая продвинутая из существующих на сегодняшний день.
C ней аннотации, документирующие типы и параметры, становятся не просто украшением, а реальным средством проверки, уменьшающим количество ошибок на production.
|
как именно скоппиплировать с режимом --check_types
у меня есть bat файлик в нем:
closure\closure\bin\calcdeps.py -i main.js -o compiled -c compiler.jar -f "--compilation_level=ADVANCED_OPTIMIZATIONS" > main-compiled.js
подскажите, пожайлуста!
Интересная система, вот бы её прикрутить к Eclipse как билдер, чтобы оно код проверяло автоматически.
Roksa tv
Roksa pl żory
Довольно забавная игра и очень сложная в некоторых местах, но нет ничего, из чего вы не смогли бы хотя бы споткнуться, проявив немного терпения в игре bloxorz.
We have a lot of fun playing different games available on the internet. run 3 is a very engaging and fun endless runner game that is loved by a lot of people, and I play it once every hour after work.
An intriguing system; I'd want to integrate it with Eclipse as a builder so that it automatically verifies the code. flappy bird
Your sumplete unlimited article was one of the most insightful and well-written pieces I've read on this topic.
I frequently love playing the game octordle and playing it with others makes it much more fun. Since the question is trickier to solve than you may think, you must put everything together.
A reputable bookmaker should have 2048 cupcakes a solid track record, a strong presence in the industry, and positive customer reviews.
I found a game called duck life and I think it will benefit you.
Pizza Tower is a great game with fun and creative gameplay. The game's graphics are very cute and colorful, creating a fun and attractive space. In addition, the sound in the game is also very unique and impressive.
I think it will benefit you. rainbow obby
I thought it would be a boring old site, but I'm glad I visited. I will post a link to this page on my blog. I'm sure my visitors will find this very useful..메이저사이트
you’re truly a just right webmaster. The website loading velocity is amazing. It kind of feels that you’re doing any distinctive trick. Also, The contents are masterwork. you have performed a wonderful job in this subject! sattamatka
Вполне нормально использовать множество файлов для каждого модуля. wordle today
This offers static type checking, which prevents needless run-time mistakes, something that compiled languages take great pride in. | construction factoring
Are you prepared to play the game bitlife life simulator and experience an interesting virtual life? Before your life is over, start your life over and make the right choices little by little, year by year, until you eventually become a model citizen bitlife
I have referenced and used it to make a web game like Minecraft 1.20.51 APK
Gutter blockages may result from clogged dry leaves, bird nests, mold buildup, or vegetation development that's why you need gutter cleaning.
True to its roguelike roots, Pokerogue features permadeath. If the player's character dies, they must start over from the beginning, making each decision and hand played critical to survival.
infinity brawl apk — это динамичная игра, доступная в формате APK. Игроки выбирают персонажей с уникальными способностями и стилями боя. Игра предлагает великолепную графику и плавный геймплей.
PokeRogue - это браузерная игра для фанатов покемонов, в значительной степени вдохновленная жанром roguelike. Сражайтесь бесконечно, собирая предметы, исследуя множество различных биомов, сражаясь с тренерами, боссами и многим другим!
Join the millions taking the rice purity test today and embark on a journey of self-discovery and entertainment! Your level of naivety will be revealed after completing questions based on your own experiences.
Quick reflexes in Drift Boss game, show your racing skills and speed.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.