使用Closure编译器键入indexOf重新定义

时间:2013-08-30 13:57:59

标签: javascript google-closure-compiler google-closure

我正在尝试为旧的IE版本重新定义Array.prototype.indexOf。根据Google Closure Compiler,我无法正确输入。

它表示@this的类型错误。

if (!Array.prototype.indexOf) {
  /**                                                                                                                                                 
   * @this {Array}                                                                                                                                    
   * @param {*} item                                                                                                                                  
   * @param {number=} from: ignored 
   * @return {number}                                                                                                                                 
   */
  Array.prototype.indexOf = function(item, from) {
    // ...
  }
}

我得到以下输出

test.js:12: WARNING - variable Array.prototype.indexOf redefined with type \
function (this:Array, *, number=): number, original definition at \
externs.zip//es3.js:633 with type function (this:Object, *, number=): number
Array.prototype.indexOf = function(item, from) {
^

令人惊讶的是,将@this {Array}更改为@this {Object}(尽管没有多大意义)会返回这个更加模糊的消息:

test.js:12: WARNING - variable Array.prototype.indexOf redefined with type \
function (this:Object, *, number=): number, original definition at \
externs.zip//es3.js:633 with type function (this:Object, *, number=): number
Array.prototype.indexOf = function(item, from) {
^

有关如何正确操作的任何提示?

2 个答案:

答案 0 :(得分:3)

您可以使用@suppress {duplicate}忽略此警告:

/**
 * @this {Array}
 * @param {*} item
 * @param {number=} from: ignored
 * @return {number}
 * @suppress {duplicate}
 */
Array.prototype.indexOf = function(item, from) {
    // ...
}

我不确定重新定义方法对高级模式下Closure Compiler的优化有何影响。

答案 1 :(得分:2)

数组方法是通用的,它们实际上应该采用类似数组的值。最新的Closure Compiler将其定义为:

/**
 * Available in ECMAScript 5, Mozilla 1.6+.
 * @param {T} obj
 * @param {number=} opt_fromIndex
 * @return {number}
 * @this {{length: number}|Array.<T>|string}
 * @nosideeffects
 * @template T
 * @see http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/indexOf
 */
Array.prototype.indexOf = function(obj, opt_fromIndex) {};

只需分配值即可:

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(item, from) {
     // ...
  }
}

考虑升级到最新版本的Compiler。