【问题标题】:Google Closure Compiler complaining about XMLHttpRequest.response typeGoogle Closure Compiler 抱怨 XMLHttpRequest.response 类型
【发布时间】:2016-08-15 00:00:18
【问题描述】:

下面是我传递给 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();

没有警告了。

问题是我不明白。为什么它可以解决问题?这样做真的正确吗?

【问题讨论】:

    标签: javascript xmlhttprequest google-closure-compiler jsdoc


    【解决方案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 ... */
      }
    );
    

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

    【讨论】:

    • 感谢您的分析和建议的修复。我不知何故未能使用正确的语法/** @type {!ArrayBuffer} */ (xhr.response)。我想我在没有括号的情况下试过了。
    • 类型转换绝对是正确的解决方案 - 这不是错误。
    • @Chad :是的,演员阵容是正确的解决方案。但是,当我拆分行 without 类型转换时警告消失的事实看起来非常像编译器错误。
    • 这只是编译器不够智能无法确定类型的一种情况。这些情况比您想象的要多,但我已将其归档以查看它是否可以解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多