我正在尝试为旧的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) {
^
有关如何正确操作的任何提示?
答案 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。