javascript - 谷歌关闭 : trouble type checking parameters that should be functions

标签 javascript types google-closure-compiler typechecking

我在搞乱谷歌闭包编译器中的类型检查。类型系统似乎很有用,即使不是最复杂的。我对大部分限制都很满意,但这个限制似乎有点奇怪。

我发现为作为参数传递的函数提供类型注释时出现问题。特别是,如果传递函数的类型本身不固定。因此,例如,我想编写与此类似的代码:

/**
 * @param {Array} xs
 * @param {function(*) : boolean} f
 * @return {Array}
 */
var filter = function (xs, f) {
    var i, result = [];
    for (i = 0; i < xs.length; i += 1) {
        if (f(xs[i])) {
            result.push(v);
        }
    }
    return result;
};

filter([1,2,3], function (x) { return x > 1; });

将“--js_error checkTypes”传递给编译器,我得到这个:

test.js:17: ERROR - left side of numeric comparison
found   : *
required: number
    filter([1,2,3], function (x) { return x > 1; });
                                          ^

所以,怎么了?我可以指定一个参数应该是一个带有一个参数的函数,而不指定该参数的类型吗?我做错了什么,还是这只是类型检查器的限制?


Chad 建议对传递给过滤器的匿名函数进行注释,以帮助进行类型推断:

filter([1,2,3], function (x) { return /** @type {number} */ (x) > 1; });

这对 filter() 有效,但似乎有点不令人满意(为什么编译器需要该注释?),并且不适用于更复杂的情况。例如:

/**
* @param {Array|string} as
* @param {Array|string} bs
* @param {function(*, *): *} f
* @return {Array}
*/
var crossF = function (as, bs, f) {};

/**
* @param {Array|string} as
* @param {Array|string} bs
* @return {Array}
*/
var cross = function (as, bs) {};

var unitlist = crossF(['AB', 'CD'], ['12', '34'], cross);

似乎这里所有内容的类型对编译器来说都是显而易见的。事实上,它直接提示匹配函数参数的类型:

test.js:52: ERROR - actual parameter 3 of crossF does not match formal parameter
found   : function ((Array|null|string), (Array|null|string)): (Array|null)
required: function (*, *): *
var unitlist = crossF(['ABC', 'DEF', 'GHI'], ['123', '456', '789'], cross);

下面接受的答案解决了这种情况。

最佳答案

将过滤器的声明从“*”(所有内容)更改为“?”(未知)。编译器只检查已知类型。因此,当编译器试图在调用点推断函数表达式的函数签名时,它会将参数“x”解析为“?” (未知类型)(可以用作任何类型),而不是在使用前通常需要限制的“*”(所有可能的类型):

/**
 * @param {Array} xs
 * @param {function(?) : boolean} f
 * @return {Array}
 */
var filter = function (xs, f) {
    var i, result = [];
    for (i = 0; i < xs.length; i += 1) {
        if (f(xs[i])) {
            result.push(v);
        }
    }
    return result;
};

关于javascript - 谷歌关闭 : trouble type checking parameters that should be functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10131118/

相关文章:

javascript - vuejs服务端如何读取xml文件内容?

java - 在java中获取HashMap中的变量类型

javascript - 调试闭包编译器编译的 Javascript

javascript - 我应该使用 YUI Compressor 还是新的 Google Closure 编译器来压缩我的 JavaScript?

javascript - 如何播放 Html 格式的视频

javascript - 使用 javascript/jquery 更改 url 并使用新 url 重新加载页面

JavaScript (Jquery) 去除小数点

go - 如何将不同类型作为 struct{} 传递给 GoLang 函数?

c - 变量类型信息如何以及在哪里存储?

javascript - 修改闭包编译器的内置 extern