2

我正在尝试重新定义Array.prototype.indexOf旧的 IE 版本。根据 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) {
^

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

4

2 回答 2

3

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

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

不过,我不确定重新定义该方法对高级模式下闭包编译器优化的影响。

于 2013-08-30T14:06:57.720 回答
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) {
     // ...
  }
}

考虑升级到最新版本的编译器。

于 2013-09-03T17:26:16.410 回答