Closure 编译器认为参数不匹配是由于从未发生过的 null 条件

Closure compiler thinks a parameter is mismatched due to a null condition that never happens

我正在使用 google closure compiler to minify my code and I recently added JSDoc annotations 来允许编译器进行类型检查和更好的缩小(在高级模式下)。不幸的是,它显示警告。有没有一种方法可以更改代码以防止警告,而无需添加闭包编译器注释来抑制它?

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 并使方法 return 为假,甚至不尝试所有 add 函数。不知道为什么 cc 认为我可以将 null 传递给 add 函数。实际代码中,isValidDateObject用的地方多,不想内联

您可以使用闭包编译器的 online version 并将优化级别设置为 "Advanced" 来缩小我的代码。

注意:这是一个简化的示例,用于展示我收到的错误。

闭包不够智能,无法确定 isValidDateObject() 将检查并且仅 return 如果它是有效的日期对象,因此您需要提示闭包您确实传递了 Date 反对你的函数:

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