下面是我传递给 Google Closure 编译器的一些代码的非常简化的版本:
"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();
但是没有任何效果。
最终所做的是将变量声明与其初始化分开,而不添加任何 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 ... */
}
);
它对我有用。我还收到您在原始版本中报告的错误。但请注意,将优化设置为“简单”时,我们不会收到错误。
关于javascript - Google Closure 编译器提示 XMLHttpRequest.response 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36775453/