闭包编译器认为参数由于从未发生的空条件而不匹配



我正在使用谷歌闭包编译器来缩小我的代码,我最近添加了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在很多地方使用,所以我不想内联它。

您可以通过使用闭包编译器的在线版本并将优化级别设置为"高级"来缩小我的代码。

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

闭包不够聪明,无法确定isValidDateObject()将检查并仅在它是有效的 date 对象时才返回,因此您需要向闭包暗示您确实在此时将Date对象传递给您的函数:

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

最新更新