在Google Closure编译器中编译chrome.webRequest.onBeforeRequest.addListener代码行时遇到问题。

我从样本https://developer.chrome.com/extensions/samples.html#12a7bf1490a26359eadf10917e37c5b9中的CatBlock扩展中获取了代码示例,并添加了一些编译器参数:

// ==ClosureCompiler==
// @output_file_name extension.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @externs_url http://closure-compiler.googlecode.com/git/contrib/externs/chrome_extensions.js
// ==/ClosureCompiler==

chrome.webRequest.onBeforeRequest.addListener(
function(info) {
    console.log("Cat intercepted: " + info.url);
    // Redirect the lolcal request to a random loldog URL.
    var i = Math.round(Math.random() * loldogs.length);
    return {redirectUrl: loldogs[i]};
},
// filters
{
    urls: ["https://i.chzbgr.com/*"],
    types: ["image"]
},
// extraInfoSpec
["blocking"]);


Closure Compiler引发两个JSC_TYPE_MISMATCH警告,并且需要BlockingResponse和RequestFilter类型。
根据API参考https://developer.chrome.com/extensions/webRequest.html,它们都是对象,但是为什么编译器拒绝我传递的对象?

我研究了chrome_extensions.js,它具有自己的BlockingResponse和RequestFilter类型的构造函数,但浏览器没有它们。

我还尝试将这个对象分配给变量并使用注释定义类型。

/** @type {!BlockingResponse} response */
var response = {redirectUrl: loldogs[i]};

/** @type {!RequestFilter} filter */
var filter= {urls: ["https://i.chzbgr.com/*"], types: ["image"]};


这没有帮助,似乎不是正确的方法。

有人可以解释我在做什么错吗?

提前谢谢了。

最佳答案

要删除警告,您需要键入强制返回值:

// ==ClosureCompiler==
// @output_file_name extension.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @externs_url http://closure-compiler.googlecode.com/git/contrib/externs/chrome_extensions.js
// ==/ClosureCompiler==

chrome.webRequest.onBeforeRequest.addListener(
  function(info) {
    console.log("Cat intercepted: " + info.url);
    // Redirect the lolcal request to a random loldog URL.
    var i = Math.round(Math.random() * loldogs.length);
    return /** @type {!BlockingResponse} */ ({redirectUrl: loldogs[i]});
},
// filters
/** @type {!RequestFilter} */
({
    urls: ["https://i.chzbgr.com/*"],
    types: ["image"]
}),
// extraInfoSpec
["blocking"]);


注意多余的括号

通过这种用法,如果extern将返回类型指定为BlockingResponse|Object.<string,*>会更好,但是我们需要为此在closure-compiler项目中提出问题。

关于javascript - 在Chrome扩展程序编译期间,Google Closure要求RequestFilter和BlockingResponse类型。如何创建这样的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15575421/

10-09 18:17
查看更多