Javascript.RU

Объявление и проверка типов в примерах

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.


Автор: Гость (не зарегистрирован), дата: 20 декабря, 2009 - 16:43
#permalink

как именно скоппиплировать с режимом --check_types

у меня есть bat файлик в нем:

closure\closure\bin\calcdeps.py -i main.js -o compiled -c compiler.jar -f "--compilation_level=ADVANCED_OPTIMIZATIONS" > main-compiled.js

подскажите, пожайлуста!


Автор: Gairon (не зарегистрирован), дата: 30 сентября, 2010 - 17:49
#permalink

Интересная система, вот бы её прикрутить к Eclipse как билдер, чтобы оно код проверяло автоматически.


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 00:16
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 13:29
#permalink

Автор: sanfeng (не зарегистрирован), дата: 5 октября, 2022 - 11:15
#permalink

Довольно забавная игра и очень сложная в некоторых местах, но нет ничего, из чего вы не смогли бы хотя бы споткнуться, проявив немного терпения в игре bloxorz.


Автор: RUN 3 (не зарегистрирован), дата: 15 декабря, 2022 - 05:51
#permalink

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.


Автор: flappy bird (не зарегистрирован), дата: 6 апреля, 2023 - 10:35
#permalink

An intriguing system; I'd want to integrate it with Eclipse as a builder so that it automatically verifies the code. flappy bird


Автор: abel1303 (не зарегистрирован), дата: 7 апреля, 2023 - 04:57
#permalink

Your sumplete unlimited article was one of the most insightful and well-written pieces I've read on this topic.


Автор: Selena (не зарегистрирован), дата: 14 июня, 2023 - 08:49
#permalink

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.


Автор: zethafa (не зарегистрирован), дата: 20 июня, 2023 - 06:24
#permalink

A reputable bookmaker should have 2048 cupcakes a solid track record, a strong presence in the industry, and positive customer reviews.


Автор: Gutierrez (не зарегистрирован), дата: 13 сентября, 2023 - 09:46
#permalink

I found a game called duck life and I think it will benefit you.


Автор: Гость (не зарегистрирован), дата: 13 сентября, 2023 - 09:49
#permalink

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.


Автор: Гость (не зарегистрирован), дата: 10 октября, 2023 - 11:09
#permalink

I think it will benefit you. rainbow obby


Автор: 메이저사이트 (не зарегистрирован), дата: 14 ноября, 2023 - 07:50
#permalink

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..메이저사이트


Автор: amna seo (не зарегистрирован), дата: 19 ноября, 2023 - 20:02
#permalink

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


Автор: Гость (не зарегистрирован), дата: 1 декабря, 2023 - 13:14
#permalink

Вполне нормально использовать множество файлов для каждого модуля. wordle today


Автор: antiguans2000, дата: 8 декабря, 2023 - 15:58
#permalink

This offers static type checking, which prevents needless run-time mistakes, something that compiled languages take great pride in. | construction factoring


Автор: Nanasi1 (не зарегистрирован), дата: 26 декабря, 2023 - 05:54
#permalink

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


Автор: AyubAlvarez (не зарегистрирован), дата: 2 апреля, 2024 - 13:28
#permalink

I have referenced and used it to make a web game like Minecraft 1.20.51 APK


Автор: antiguans2000, дата: 11 апреля, 2024 - 11:49
#permalink

Gutter blockages may result from clogged dry leaves, bird nests, mold buildup, or vegetation development that's why you need gutter cleaning.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
14 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum