Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 注释由构造函数参数设置的实例属性?_Javascript_Google Closure Compiler_Google Closure - Fatal编程技术网

Javascript 注释由构造函数参数设置的实例属性?

Javascript 注释由构造函数参数设置的实例属性?,javascript,google-closure-compiler,google-closure,Javascript,Google Closure Compiler,Google Closure,当使用google闭包编译器时,是否需要注释由构造函数参数设置的属性?e、 g /** * @constructor * @param {string} bar * @param {number} barPrivate */ var Foo = function(bar, barPrivate) { this.bar = bar; this.barPrivate_ = barPrivate; }; 如果我写这篇文章,编译器是否足够聪明,能够理解: bar属性的类型为{strin

当使用google闭包编译器时,是否需要注释由构造函数参数设置的属性?e、 g

/**
 * @constructor
 * @param {string} bar
 * @param {number} barPrivate
 */
var Foo = function(bar, barPrivate) {
  this.bar = bar;
  this.barPrivate_ = barPrivate;
};
如果我写这篇文章,编译器是否足够聪明,能够理解:

  • bar
    属性的类型为
    {string}
  • barPrivate
    属性的类型为
    {number}
  • barPrivate
    属性是
    @private
  • 还是我需要更明确

    /**
     * @constructor
     * @param {string} bar
     * @param {number} barPrivate
     */
    var Foo = function(bar, barPrivate) {
      /** @type {string} */
      this.bar = bar;
      /** @private {number} */
      this.barPrivate_ = barPrivate;
    };
    
    后一种形式似乎不那么“干燥”,但我们一直在用它来保证安全。我还没有找到任何关于这方面的文档

    在做了一些简单的探索之后 是一样的
    ... 对我来说,这意味着可见性声明可能是必需的,但类型声明不是必需的?

    我必须运行一些测试才能确定,但我的理解是:

  • 二,。是的,编译器知道
    bar
    是类型
    string
    barPrivate
    是类型
    number
    。但仅限于构造函数调用的持续时间。它不会强制执行
    this.bar
    在以后的代码中只能是字符串

  • 否,当您提供注释时,编译器将仅强制执行
    @private
    访问,如显式示例中所示

  • 这些类型的检查中,有一些在特定情况下更可靠,但可能不是这样

    当您在另一个方法(或稍后在构造函数中)中为属性指定不同的类型时,请尝试查看编译器在有或没有这些注释的情况下执行的操作

    是否在方法中指定局部变量的类型也会出现同样的问题


    编辑:正如Chad Killingsworth指出的,在这个简单的例子中,编译器可以推断
    this.bar
    是一个没有附加注释的字符串;但是如果其他类型被分配到
    this.bar
    的其他位置,那么“所有赌注都输掉了”,我不知道编译器会做什么。

    是的,根据我运行的测试,我认为您的理解是正确的。我最感兴趣的是它是否知道this.bar的类型。在其他方法中,根据我的测试,答案是一个限定的“否”(限定的原因是AST似乎仍然报告正确的类型,但编译器不会发出我期望的警告,除非我显式地解释类型)。添加CHECK\u TYPES\u NEW\u接口似乎也不能真正解决问题:-/。编译器应该正确推断
    this.bar
    在所有情况下都是
    字符串,即使在构造函数之外,也没有附加注释<但是需要code>@private