使用Google Closure的@typedef标签

时间:2011-05-10 11:44:15

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

Google的Closure编译器有一个“@typedef”标记,但在代码中使用它们是否可以? (我知道它会起作用,但它不受欢迎吗?)

所以这是我的类型

/**
 * The plan object's typedef
 * @typedef {Object}
 */
Types.Plan = {
    "style": "bordersmall",
    "width": "50%",
    "height": "40%",
    "x": "20%",
    "y": "10%",
    "clickable": true,
    "moveable": true
};

然后我可以在我的JSDoc注释中使用该类型。

这允许我的IDE在传递的参数

上给我自动完成功能

因此声明的对象不会在代码中的任何地方使用。

/**
 * The Instructions class
 * @param   {Types.Plan}    plan        Plan for position and dimension
 * @param   {Manager}       manager     The manager
 * @param   {Instructions}  parent      This widget's parent's instructions
 * @return  {Instructions}              Returns the new instructions object
 */
Instructions = function(plan, manager, parent){
    plan.
}

这样可以吗?或者有更好的解决方案吗?

3 个答案:

答案 0 :(得分:7)

这很好。您还可以使用记录类型来启用编译器的其他类型检查:

/**
 * @typedef {{
 *   style: string, 
 *   width: string, 
 *   height: string, 
 *   x: string, 
 *   y: string, 
 *   clickable: boolean, 
 *   moveable: boolean
 * }} 
 */
var myType = ...

http://code.google.com/closure/compiler/docs/js-for-compiler.html#types

答案 1 :(得分:7)

@typedef用于定义类型,而不是将对象标记为特定类型。如果要将某个变量标记为特定类型,请使用@type {<type>}注释。

@typedef用于定义“短手”类型,以便与@type {...}构造一起使用。

请注意,对象的属性当前未在Closure Compiler中输入,即使已标记,但可能在将来。

答案 2 :(得分:0)

typedef是用于创建类型的,因此不愿意将其用作名称空间(向其分配对象文字)。不久前,我写了blog post关于各种typedef陷阱。