Как мне заставить Closure Compiler перестать жаловаться на типы объединений при вызове функции? - PullRequest
10 голосов
/ 28 октября 2010

В частности, я вижу это при использовании файла externs jQuery-1.4.3.Javadocs для этого читает

/**
 * @param {(string|number|function(number,number))=} arg1
 * @return {(number|jQueryObject)}
 * @nosideeffects
 */
jQueryObject.prototype.width = function(arg1) {};

У меня есть вызов, который выглядит так:

   var w =  $(window).width();
    $('#whatever').width(w)

Закрытие жалуется: ПРЕДУПРЕЖДЕНИЕ - фактический параметр 1 в jQueryObject.prototype.height не соответствует формальномунайден параметр: (jQueryObject | null | число) обязательно: (функция (число, число):? | number | string | undefined) $ ('# Xobni'). height ($ (window) .height ());

Из игры (удаляя возможные типы возврата) я вижу, что проблема в том, что первый вызов width может возвращать, возможно, jQueryObject, и, поскольку это неверный ввод, Closure выдает мне ошибку.Я попытался добавить это:

/**
 * @type {number}
 */
var w =  $(window).width();
$('#Xobni').width(w);

Но тогда Closure жалуется: ПРЕДУПРЕЖДЕНИЕ - найдена инициализирующая переменная: (jQueryObject | null | number) требуется: число var w = $ (window) .width ();

Проблема в том, что когда аргумент width принимает аргумент, он возвращает jQueryObject.Когда он не принимает аргумент, он возвращает число.Так что я знаю, что мой звонок в порядке, но javadocs не совсем это отражают, и поэтому Closure предупреждает меня.Есть ли способ исправить javadocs надлежащим образом или способ сказать Closure, что я знаю, что этот результат будет числом.Я знаю, что, возможно, смогу устранить ошибку, но я хотел бы знать, как лучше аннотировать эти вещи.

Спасибо за помощь!

Ответы [ 2 ]

8 голосов
/ 28 октября 2010

Вы можете изменить это следующим образом:

var w = /** @type {number} */ ($(window).width());
$('#whatever').width(w)
2 голосов
/ 28 октября 2010

Попробуйте это:

var w =  $(window).width();
w = parseInt(w.toString());
$('#whatever').width(w);

или это:

var w =  $(window).width() + '';
$('#whatever').width(w);
...