Google Closure Compiler抱怨XMLHttpRequest.response类型

时间:2016-04-21 16:24:31

标签: javascript xmlhttprequest google-closure-compiler jsdoc

以下是我传递给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指令修复它,以便明确定义&#39; xhr.response&#39;的类型。 as&#39; ArrayBuffer&#39;。

例如:

/** @property {ArrayBuffer} response */
var xhr = new XMLHttpRequest();

但没有任何效果。

DID最终的作用是将变量声明与其初始化分开,而不添加任何JSDoc指令:

var xhr;
xhr = new XMLHttpRequest();

不再有警告了。

问题在于我无法得到它。为什么要解决这个问题?这真的是对的吗?

1 个答案:

答案 0 :(得分:1)

  

为什么要解决这个问题?

我认为你在封闭编译器中发现了一个错误。你可以report an issue来了解它。

将该行拆分为两行不应该改变编译器正在做的事情。为清楚起见,这是您拆分的行。

var xhr;
xhr = new XMLHttpRequest();

我使用online closure compiler确认了您的报告,优化设置为高级。

  

这真的是对的吗?

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 ... */
  }
);

那对我有用。我还会收到您使用原始版本报告的错误。但请注意,将优化设置为“简单”时,我们不会收到错误。