使用谷歌闭包编译器时,是否需要注释由构造函数参数设置的属性? 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;
};
后一种形式似乎更少" DRY",但它是我们一直在使用的安全方面。我没有找到任何关于这方面的文件......
在做了一些最小的探索之后AST with visibility declarations (but no type declarations) 与...相同 AST when type declarations are included ...对我来说,这意味着可见性声明可能是必要的,但类型声明不是?
答案 0 :(得分:1)
我必须进行一些测试才能确定,但这是我的理解:
和2.是的,编译器知道bar
类型为string
,barPrivate
类型为number
。 但仅限于构造函数调用的持续时间。不会强制this.bar
只能是以后代码中的字符串。
不,编译器只会在您提供注释时强制执行@private
访问权限。
有些类型的检查对new type inference (NTI)更强大,但可能不是这些特定情况。
在另一个方法(或稍后在构造函数中)为属性分配不同的类型时,尝试查看编译器使用或不使用这些注释的功能。
同样的问题是在方法中是否指定局部变量的类型。
编辑:正如Chad Killingsworth指出的那样,在这个简单的例子中,编译器可以推断出this.bar
是一个没有附加注释的字符串;但是如果在this.bar
的其他地方分配了其他类型,那么“所有投注都已关闭”,我不知道编译器会做什么。