दस्तावेज़ JSDoc में फ़ंक्शन पैरामीटर को नष्ट कर दिया


90

पहले मैंने हमेशा अपने ऑब्जेक्ट पैरामीटर को निम्नानुसार प्रलेखित किया है:

/**
 * Description of the function
 *
 * @param {Object} config - The configuration
 * @param {String} config.foo
 * @param {Boolean} [config.bar] - Optional value
 * @return {String}
 */
function doSomething (config = {}) {
  const { foo, bar } = config;
  console.log(foo, bar);
  // do something
}

लेकिन मैं अनिश्चित हूं कि डिसट्रक्टेड फंक्शन पैरामीटर के साथ सबसे अच्छा तरीका क्या है। क्या मैं सिर्फ ऑब्जेक्ट को अनदेखा करता हूं, इसे किसी तरह परिभाषित करता हूं या इसे दस्तावेज करने का सबसे अच्छा तरीका क्या है?

/**
 * Description of the function
 *
 * @param {String} foo
 * @param {Boolean} [bar] - Optional value
 * @return {String}
 */
function doSomething ({ foo, bar } = {}) {
  console.log(foo, bar);
  // do something
}

मुझे लगता है कि ऊपर दिए गए मेरे दृष्टिकोण से यह स्पष्ट नहीं होता है कि फ़ंक्शन एक objectऔर दो अलग-अलग मापदंडों की अपेक्षा करता है ।

एक और तरीका है जिसके बारे में मैं सोच सकता हूं कि इसका उपयोग किया जाएगा @typedef, लेकिन यह एक बड़ी गड़बड़ी हो सकती है (विशेष रूप से कई तरीकों के साथ एक बड़ी फ़ाइल में)?

/**
 * @typedef {Object} doSomethingConfiguration
 * @property {String} foo
 * @property {Boolean} [bar] - Optional value
 */

/**
 * Description of the function
 *
 * @param {doSomethingConfiguration}
 * @return {String}
 */
function doSomething ({ foo, bar } = {}) {
  console.log(foo, bar);
  // do something
}

1
मुझे लगता है कि पहला दृष्टिकोण अभी भी ठीक है। किसी को परवाह नहीं है कि configआपके कोड में ऑब्जेक्ट का नाम है या उसका कोई नाम है या नहीं।
बर्गी

WebStorm में मैंने पाया है कि अगर मैं सिर्फ (बाद में विनाशकारी) मापदंडों का वर्णन करता हूं और विनाशकारी को अनदेखा करता हूं तो यह कम-आम मामलों को छोड़कर ज्यादातर काम करता है। तो आपके उदाहरण में, दो मापदंडों का वर्णन करें fooऔर bar। यह अंतिम समाधान नहीं है, लेकिन किसी वस्तु के उपयोग से कोई भी दृष्टिकोण निरीक्षण त्रुटियों - और आईडीई से निरीक्षण और स्वत: पूर्णता प्राप्त करता है जो मुझे सबसे ज्यादा परवाह है।
मोरे

जवाबों:


96

यह इस तरह से है, जैसा कि प्रलेखन में वर्णित है ।

/**
 * My cool function.
 *
 * @param {Object} obj - An object.
 * @param {string} obj.prop1 - Property 1.
 * @param {string} obj.prop2 - Property 2.
 */
var fn = function ({prop1, prop2}) {
  // Do something with prop1 and prop2
}

तो, आपका पहला उदाहरण बहुत सही है।

कुछ गहरे घोंसले के शिकार के साथ एक और उदाहरण:

/**
 * Nesting example.
 *
 * @param {object} param
 * @param {number} param.a - First value
 * @param {object} param.b - Wrapper
 * @param {number} param.b.c - Second value
 * @return {number} sum a and b
 */
letters = ({a, b: {c}}) => a + c;

मैं नहीं देखता कि कैसे JSDoc unambiguously काम करता है जब आपके पास कई विनाशकारी तर्क होते हैं, जैसे function ({a}, {a}) {}। JSDoc मुझे लगता है कि होगा @param {object} param1, @param {*} param1.a, @param {object} param2, @param {*} param2.a, और @paramटैग के आदेश पर निर्भर करेगा ?
ZachB

@ZachB: function ({a}, {a}) {}अमान्य सिंटैक्स है, क्योंकि aदो बार, वहाँ परिभाषित किया गया है।
सेर्ब्रस

1
उफ़। ({a: b}, {a}))या ({a}, {b})- बिंदु यह था कि JSDoc @paramटैग क्रमहीन AFAIK हैं और कुंजी अस्पष्ट हो सकती हैं, संपत्ति के नाम का उपयोग करके मैच करने की कोशिश करने के लिए JSDoc थे। इस परिदृश्य को हल करने के लिए VSCode का अगला संस्करण स्थितीय लुकअप का उपयोग करने जा रहा है।
ZachB

1
धन्यवाद, @ d0gb3r7 मैंने उत्तर में लिंक अपडेट किया है।
सेरेब्रस

10

मैं व्यक्तिगत रूप से इसका उपयोग करता हूं:

/**
* @param {{
  a: number
  b: number
}} param0
* @returns {number} The sum
*/
const func = ({ a, b }) => a + b;

बस वहीं ऑब्जेक्ट बनाएं।

मैं भी टाइपप्रति का लाभ लेने के लिए, और obtional घोषणा करेंगे bके रूप में b?या b: number | undefinedके रूप में JSDoc भी यूनियनों की अनुमति देता है


-8

देखें JSDoc की "एक पैरामीटर के गुणों का दस्तावेजीकरण" :

/**
 * Assign the project to an employee.
 * @param {Object} employee - The employee who is responsible for the project.
 * @param {string} employee.name - The name of the employee.
 * @param {string} employee.department - The employee's department.
 */
Project.prototype.assign = function(employee) {
    // ...
};

( Google क्लोजर कंपाइलर प्रकार की जाँच , जो JSDoc से डायवर्ट की गई थी, पर आधारित है @param {{x:number,y:number}} point A "point-shaped" object.) भी अनुमति देता है )


2
क्या वह पहले से ही ऐसा नहीं कर रहा है? वह पूछ रहा है कि अब क्या करना है कि employeeफ़ंक्शन में कोई चर नहीं है ।
बर्गी

7
यह प्रश्न का उत्तर नहीं देता है - यह उदाहरण विनाशकारी उपयोग नहीं करता है! विनाश के साथ आपके पास कोई मूल वस्तु नहीं है।
मोर

वास्तव में उसका वही लिंक, उसके उदाहरण के ठीक बाद के लिए उसी सटीक jsdoc टिप्पणियों के साथ एक सापेक्ष उदाहरण देता है Project.prototype.assign = function({ name, department })। उदाहरण से पहले वे कहते हैं, "यदि एक स्पष्ट नाम के बिना एक पैरामीटर नष्ट हो जाता है, तो आप ऑब्जेक्ट को एक उपयुक्त दे सकते हैं और अपनी संपत्तियों को दस्तावेज कर सकते हैं।"
नोटाचू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.