代码之家  ›  专栏  ›  技术社区  ›  Mad Echet

使用闭包编译器键入重新定义的索引

  •  2
  • Mad Echet  · 技术社区  · 11 年前

    我正在努力重新定义 Array.prototype.indexOf 用于旧IE版本。根据谷歌闭包编译器,我在正确键入它时遇到了问题。

    它说 @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 回复  |  直到 11 年前
        1
  •  3
  •   Tibos    11 年前

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

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

    不过,我不确定在ADVANCED模式下重新定义该方法对闭包编译器的优化有什么影响。

        2
  •  2
  •   John    11 年前

    数组方法是通用的,它们实际上应该采用类似于Array的值。最新的闭包编译器将其定义为:

    /**
     * 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) {
         // ...
      }
    }
    

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