在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"]};
这没有用,似乎不是正确的方式。
有人可以解释我做错了吗?
非常感谢提前。
答案 0 :(得分:0)
要删除警告,您需要输入强制转换值:
// ==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项目中提出一个问题。