javascript - Google Closure 编译器提示 XMLHttpRequest.response 类型

标签 javascript xmlhttprequest google-closure-compiler jsdoc

下面是我传递给 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/

相关文章:

javascript - Closure Compiler 如何使用类型信息来编译更快的 JavaScript?

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

javascript - 访问由 Object.create 创建的对象中的父( super )方法

javascript - 我的部分 js 脚本在我的 ejs 文件中不起作用

javascript - 将 API key 设置为 XMLHttpRequest 的 header

angularjs - 将本地 Node JS HTTP 服务器端口(在 Electron 中运行)传递给 angular.service

javascript - 尝试从可观察数组中获取特定元素

javascript - 通过 javascript 解析复选框页面

jquery - 最新的 Tampermonkey/Greasemonkey 还不能使用 jQuery AJAX 吗?

Polymer 和 Google Closure Compiler