Google 闭包编译器抱怨 XMLHttpRequest.response 类型
Google Closure Compiler complaining about XMLHttpRequest.response type
下面是我传递给 Google Closure Compiler 的一些代码的简化版本:
"use strict";
var xhr = new XMLHttpRequest();
xhr.open("GET", "somefile", true);
xhr.responseType = "arraybuffer";
xhr.addEventListener(
'load',
function() {
var data = new Uint8Array(xhr.response);
/* ... do something ... */
}
);
这基本上是一个 Ajax 检索原始二进制数据的查询,它按预期工作。
但是,编译器发出以下警告:
WARNING - actual parameter 1 of Uint8Array does not match formal parameter
found : *
required: (Array<number>|ArrayBuffer|ArrayBufferView|null|number)
var data = new Uint8Array(xhr.response);
^
我花了一些时间尝试用 JSDoc 指令修复它,以便将 'xhr.response' 的类型明确定义为 'ArrayBuffer'。
例如:
/** @property {ArrayBuffer} response */
var xhr = new XMLHttpRequest();
但没有任何效果。
DID 最终的工作是将变量声明与其初始化分开,而不添加任何 JSDoc 指令:
var xhr;
xhr = new XMLHttpRequest();
不再有警告。
问题是我不明白。为什么它能解决问题?这真的是正确的做法吗?
Why does it fix the problem?
我认为您在闭包编译器中发现了一个错误。你可以 report an issue 关于它。
将该行分成两行不应改变编译器正在做的事情。为清楚起见,这里是您拆分的行。
var xhr;
xhr = new XMLHttpRequest();
我使用优化设置为高级的 online closure compiler 确认了你的报告。
Was it really the right thing to do?
html5.js extern中的定义是
/**
* @type {*}
* @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#the-responsetype-attribute
*/
XMLHttpRequest.prototype.response;
所以你得到的错误是合理的。用类型转换修复它:
var r = /** @type {!ArrayBuffer}*/(xhr.response);
var data = new Uint8Array(r);
在 online closure compiler 中尝试将优化设置为高级。
"use strict";
var xhr = new XMLHttpRequest();
xhr.open("GET", "somefile", true);
xhr.responseType = "arraybuffer";
xhr.addEventListener(
'load',
function() {
var r = /** @type {!ArrayBuffer}*/(xhr.response);
var data = new Uint8Array(r);
/* ... do something ... */
}
);
它在那里对我有用。我也收到了您在原始版本中报告的错误。但是请注意,将优化设置为 "Simple" 我们不会收到错误。
下面是我传递给 Google Closure Compiler 的一些代码的简化版本:
"use strict";
var xhr = new XMLHttpRequest();
xhr.open("GET", "somefile", true);
xhr.responseType = "arraybuffer";
xhr.addEventListener(
'load',
function() {
var data = new Uint8Array(xhr.response);
/* ... do something ... */
}
);
这基本上是一个 Ajax 检索原始二进制数据的查询,它按预期工作。
但是,编译器发出以下警告:
WARNING - actual parameter 1 of Uint8Array does not match formal parameter
found : *
required: (Array<number>|ArrayBuffer|ArrayBufferView|null|number)
var data = new Uint8Array(xhr.response);
^
我花了一些时间尝试用 JSDoc 指令修复它,以便将 'xhr.response' 的类型明确定义为 'ArrayBuffer'。
例如:
/** @property {ArrayBuffer} response */
var xhr = new XMLHttpRequest();
但没有任何效果。
DID 最终的工作是将变量声明与其初始化分开,而不添加任何 JSDoc 指令:
var xhr;
xhr = new XMLHttpRequest();
不再有警告。
问题是我不明白。为什么它能解决问题?这真的是正确的做法吗?
Why does it fix the problem?
我认为您在闭包编译器中发现了一个错误。你可以 report an issue 关于它。
将该行分成两行不应改变编译器正在做的事情。为清楚起见,这里是您拆分的行。
var xhr;
xhr = new XMLHttpRequest();
我使用优化设置为高级的 online closure compiler 确认了你的报告。
Was it really the right thing to do?
html5.js extern中的定义是
/**
* @type {*}
* @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#the-responsetype-attribute
*/
XMLHttpRequest.prototype.response;
所以你得到的错误是合理的。用类型转换修复它:
var r = /** @type {!ArrayBuffer}*/(xhr.response);
var data = new Uint8Array(r);
在 online closure compiler 中尝试将优化设置为高级。
"use strict";
var xhr = new XMLHttpRequest();
xhr.open("GET", "somefile", true);
xhr.responseType = "arraybuffer";
xhr.addEventListener(
'load',
function() {
var r = /** @type {!ArrayBuffer}*/(xhr.response);
var data = new Uint8Array(r);
/* ... do something ... */
}
);
它在那里对我有用。我也收到了您在原始版本中报告的错误。但是请注意,将优化设置为 "Simple" 我们不会收到错误。