2015-09-13 75 views
7

爲了避免在我的JavaScript代碼中使用new,我編寫了工廠來創建對象。用JSDoc記錄工廠

我已經嘗試了多種組合,並且給了我最滿意的結果之一是:

/** 
* Document module 
* @module app/document 
*/ 
(function() { 
    'use strict'; 

    /** 
    * Factory that creates a document object. 
    * @alias module:app/document.factory 
    * @return {document} 
    */ 
    function document() { 
     /** 
     * Get document id 
     * @method id 
     * @return {String} 
     */ 
     var id = function id() {...}, 
      api = { 
       id: id 
      }; 

     return api; 
    } 

    /** 
    * This module exports the {@link module:app/document.factory|factory} function. 
    */ 
    module.exports = document; 
}()); 

的問題,這些意見是沒有定義document對象。因此,我不能在另一個對象中引用此對象,並且在擴展此對象時我無法繼承它的文檔。

什麼是適當的方式來記錄這種類型的對象?

如果我使用@typedef標籤,我得到的靜態factory方法 和document對象正確記錄 而是由JSDoc不會產生id方法的文檔:

/** 
* Document module. 
* @module app/document 
*/ 
(function() { 
    'use strict'; 

    /** 
    * Factory that creates a document object. 
    * @function module:app/document.factory 
    * @return {document} 
    */ 
    function factory(agent) { 
     /** 
     * @callback document~id 
     * @returns {String} 
     */ 
     var id = function id() {...}, 

      /** 
      * @typedef document 
      * @property {document~id} id 
      */ 
      document = { 
       id: id 
      }; 

     return document; 
    } 

    module.exports = factory; 
}()); 
+0

儘量不要喲使用保留的關鍵字作爲文檔或功能的ID – Sagi

+0

使用@typedef - 這將允許您引用它 –

+0

@ elad.chen我編輯了問題以嘗試與@ @ typedef',但我沒有得到預期的結果。 – goriol

回答

1

我給你的建議是很好定義模塊上的輸出使用@typedef來定義類型,然後使用@type {FactoryDe​​finition}標註模塊.exports =工廠

/** @typedef {{ id: !string }} */ 
var DocumentDefinition; 

/** @typedef {!function(!object):!DocumentDefinition} */ 
var FactoryDefinition; 

/** @type {FactoryDefinition} */ 
module.exports = factory