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

时间:2016-05-26 16:38:44

标签: javascript google-closure-compiler google-closure

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

/**
 * @constructor
 * @param {string} bar
 * @param {number} barPrivate
 */
var Foo = function(bar, barPrivate) {
  this.bar = bar;
  this.barPrivate_ = barPrivate;
};

如果我写这个,那么编译器是否足够聪明,可以找出:

  1. bar属性的类型为{string}
  2. barPrivate属性的类型为{number}
  3. barPrivate属性为@private
  4. 或者我需要更明确吗?

    /**
     * @constructor
     * @param {string} bar
     * @param {number} barPrivate
     */
    var Foo = function(bar, barPrivate) {
      /** @type {string} */
      this.bar = bar;
      /** @private {number} */
      this.barPrivate_ = barPrivate;
    };
    

    后一种形式似乎更少" DRY",但它是我们一直在使用的安全方面。我没有找到任何关于这方面的文件......

    在做了一些最小的探索之后AST with visibility declarations (but no type declarations) 与...相同 AST when type declarations are included ...对我来说,这意味着可见性声明可能是必要的,但类型声明不是?

1 个答案:

答案 0 :(得分:1)

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

  1. 和2.是的,编译器知道bar类型为stringbarPrivate类型为number但仅限于构造函数调用的持续时间。不会强制this.bar只能是以后代码中的字符串。

  2. 不,编译器只会在您提供注释时强制执行@private访问权限。

  3. 有些类型的检查对new type inference (NTI)更强大,但可能不是这些特定情况。

    在另一个方法(或稍后在构造函数中)为属性分配不同的类型时,尝试查看编译器使用或不使用这些注释的功能。

    同样的问题是在方法中是否指定局部变量的类型。

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