如何在JavaScript中记录返回

如何在JavaScript中记录返回,javascript,google-closure-compiler,jsdoc,code-documentation,Javascript,Google Closure Compiler,Jsdoc,Code Documentation,我正在为浏览器应用程序的项目编写自己的库,在决定如何注释代码时遇到了同样的老问题 我试图遵循语法,但可能会继续这样做。我可能会在文档中使用两个@return和@returns标记,只是为了便于移植(当我设置文档的自动生成时) 现在,问题是,如何记录从函数返回的自定义匿名对象?例如: return { username: 'username', password: 'password', enabled: true }; JsDoc有一个例子,说明了如何将@param记

我正在为浏览器应用程序的项目编写自己的库,在决定如何注释代码时遇到了同样的老问题

我试图遵循语法,但可能会继续这样做。我可能会在文档中使用两个@return和@returns标记,只是为了便于移植(当我设置文档的自动生成时)

现在,问题是,如何记录从函数返回的自定义匿名对象?例如:

return {
    username: 'username',
    password: 'password',
    enabled:  true
};

JsDoc有一个例子,说明了如何将@param记录为具有特定字段的对象,而不是@returns标记。类似地,记录类型的Google Closure编译器文档是模糊的,没有示例可以解决它。

如果将其放在函数顶部

function myFunction() {
    /**
     * Description of my function
     * @return {!Object.<string, string|boolean>} Returns an object containing username, password and enabled information
     */

    // Do stuff
    return {
        username: 'username',
        password: 'password',
        enabled:  true
    }
}
函数myFunction(){
/**
*我的职能说明
*@return{!Object.}返回一个包含用户名、密码和启用信息的对象
*/
//做事
返回{
用户名:“用户名”,
密码:“password”,
已启用:true
}
}

闭包编译器使用了的一个子集(并添加了一些自己的)。有关完整的设置,请参见。JSDoc注释类似于JavaDoc注释,是以
/**
开头的注释块(双星)。虽然注释的每一行通常都以自己的
*
开头,但这是一种不需要的约定。每行只允许一个JSDoc标记,但标记的参数可以跨多行

注释通常应用于以下语句。以下是一些例子:

变量 类型转换 注意额外的括号

命名函数 函数表达式 定义类型 为了方便和可维护性,可以使用typedef对复杂类型(包括联合和记录类型)添加别名。这些注释可以很长,但为了便于阅读,可以拆分为多行

/** @typedef {{
 *             foo:string,
 *             bar:number,
 *             foobar:number|string
 *           }}
 */
var mytype;
对于最初的示例,有几种可能的方法可以注释这样的函数返回值。最具体、最方便的记录类型之一是:

/** @return {{username:string, password:string, enabled:boolean}} */
function() {
  return {
    username: 'username',
    password: 'password',
    enabled:  true
  }
}
注意额外的
{}
。还要记住,记录类型不会阻止属性重命名

此注释告诉编译器该函数返回一个匿名类型,其中包含
用户名
密码
已启用属性。其他有效选项是在别处定义接口,并将返回值类型转换为该接口。最不具体的注释是
对象
*


要查看各种可能的注释,请查看。

一种很好的可移植方法如下,使用return作为关键字

如果您必须在多个位置使用它,那么您必须复制它,或者使用
@typedef
,但我还不知道如何向
@typedef
添加注释,因此我使用了如下内容

/**
 * @typedef {username:string, password:string, enabled:boolean} MyType
 *  
 *  username: The name of the user 
 *  password: Some password
 *  enabled: Is the user enabled?
 */

/**
 * @return {MyType}
 */
function getObj () {
     return {
         username: 'username',
         password: 'password',
         enabled:  true
      };
}

您也可以尝试此处的建议

返回类型为
Object
。为什么你不简单地用几行来描述对象结构,就像你对参数所做的那样?请看@elusiver是的,我总是可以这样做的,关键是让编译器拥有它可以使用的信息,而不仅仅是供人阅读。或者,如果你喜欢这种记法的话,在函数之上。(我总是把它们放在里面,所以如果我对一个函数执行.toString(),我可以看到文档)我实际上在询问之前阅读了它,并且在过去使用过google闭包编译器。我仍然不清楚如何继续。想象一下,需要在多行中记录20个字段。我是否在每行的开头都加上星号(*)?更多测试正在进行中。编译器使用JSDoc注释。我将更新答案,使其更完整。@ChadKillingsworth你好,Chad,很抱歉打断了一个旧线程,但这在google
闭包注释多行中得分很高。我正在研究如何使用@typedef注释复杂类型。注释不能分散在多行上(我认为),但它会使复杂的typedef更具可读性。例如,
{{hands:number,walk:function(number):boolean,stop:function():boolean…和lots more…}
单个注释可以跨越多行。我为typedefs添加了一个示例。
/** @type {function(string):boolean} */
var foo = function(bar) { return true; }

var foo2 =
  /**
   * @param {string} bar
   * @return {boolean}
   */
  function(bar) { return true; }
/** @typedef {{
 *             foo:string,
 *             bar:number,
 *             foobar:number|string
 *           }}
 */
var mytype;
/** @return {{username:string, password:string, enabled:boolean}} */
function() {
  return {
    username: 'username',
    password: 'password',
    enabled:  true
  }
}
/**
 * @return {object} return An object with the following properties
 * @return {string} return.username Some username
 * @return {string} return.password Some password
 * @return {boolean} return.enabled Is the user enabled?
 */
function getObj () {
     return {
         username: 'username',
         password: 'password',
         enabled:  true
      };
}
/**
 * @typedef {username:string, password:string, enabled:boolean} MyType
 *  
 *  username: The name of the user 
 *  password: Some password
 *  enabled: Is the user enabled?
 */

/**
 * @return {MyType}
 */
function getObj () {
     return {
         username: 'username',
         password: 'password',
         enabled:  true
      };
}