Закрывающий компилятор считает, что параметр не соответствует из-за нулевого условия, которое никогда не происходит - PullRequest
0 голосов
/ 18 октября 2018

Я использую компилятор Google Closure , чтобы минимизировать мой код, и я недавно добавил JSDoc аннотации , чтобы позволить компилятору выполнять проверку типов и улучшать минимизацию (в расширенном режиме).К сожалению, это отображает предупреждение.Есть ли способ изменить код, чтобы предотвратить предупреждение, не добавляя комментарий компилятора замыкания, чтобы подавить его?

JSC_TYPE_MISMATCH: actual parameter 1 of add does not match formal parameter
found   : (Date|null)
required: Date at line 30 character 8
    add(date, 1, "second");
        ^

Вот код JS, который я пытаюсь минимизировать

/**
 * @param {?Date|*} date
 * @returns {!boolean}
 * @private
 */
function isValidDateObject(date) {
    return (date instanceof Date) && !isNaN(date.getTime());
};

/**
 * @param {!Date} date
 * @param {!number} num
 * @param {!string} unit
 */
function add(date, num, unit) {
    if (unit === "second") {
        date.setSeconds(date.getSeconds() + num);
    }
}

/**
 * @param {Date} date
 * @return {Date}
 */
function addOneSecond(date) {
    if (!isValidDateObject(date)) {
        return date;
    }

    add(date, 1, "second");
    return date;
}

Проверка date instanceof Date должна обрабатывать дату, являющуюся null, и заставить метод возвращать значение false, и даже не пытаться выполнить все функции add.Не уверен, почему cc думает, что я мог бы передать null в функцию add.В реальном коде isValidDateObject используется во многих местах, поэтому я не хочу вставлять его.

Вы можете минимизировать мой код, используя онлайн-версию компилятора закрытия иустановка уровня оптимизации на «Advanced».

Примечание. Это упрощенный пример, демонстрирующий полученную ошибку.

1 Ответ

0 голосов
/ 18 октября 2018

Замыкание недостаточно умен, чтобы определить, что isValidDateObject() будет проверять и возвращать, только если это допустимый объект даты, поэтому вам нужно дать подсказку, чтобы закрыть, что вы действительно передаете объект Date своей функции в этот момент:

add(/** @type {!Date} */ (date), 1, "second");
...