# require-description * [Options](#user-content-require-description-options) * [`checkConstructors`](#user-content-require-description-options-checkconstructors) * [`checkGetters`](#user-content-require-description-options-checkgetters) * [`checkSetters`](#user-content-require-description-options-checksetters) * [`contexts`](#user-content-require-description-options-contexts) * [`descriptionStyle`](#user-content-require-description-options-descriptionstyle) * [`exemptedBy`](#user-content-require-description-options-exemptedby) * [Context and settings](#user-content-require-description-context-and-settings) * [Failing examples](#user-content-require-description-failing-examples) * [Passing examples](#user-content-require-description-passing-examples) Requires that all functions (or optionally other structures) with a JSDoc block have a description. * All functions must have an implicit description (e.g., text above tags) or have the option `descriptionStyle` set to `tag` (requiring `@description` (or `@desc` if that is set as your preferred tag name)). * Every JSDoc block description (or `@description` tag if `descriptionStyle` is `"tag"`) must have a non-empty description that explains the purpose of the method. ## Options A single options object has the following properties. ### checkConstructors A value indicating whether `constructor`s should be checked. Defaults to `true`. ### checkGetters A value indicating whether getters should be checked. Defaults to `true`. ### checkSetters A value indicating whether setters should be checked. Defaults to `true`. ### contexts Set to an array of strings representing the AST context where you wish the rule to be applied (e.g., `ClassDeclaration` for ES6 classes). `context` defaults to `any` and `comment` defaults to no specific comment context. Overrides the default contexts (`ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`). Set to `"any"` if you want the rule to apply to any JSDoc block throughout your files (as is necessary for finding function blocks not attached to a function declaration or expression, i.e., `@callback` or `@function` (or its aliases `@func` or `@method`) (including those associated with an `@interface`). See the ["AST and Selectors"](../advanced.md#ast-and-selectors) section of our Advanced docs for more on the expected format. ### descriptionStyle Whether to accept implicit descriptions (`"body"`) or `@description` tags (`"tag"`) as satisfying the rule. Set to `"any"` to accept either style. Defaults to `"body"`. ### exemptedBy Array of tags (e.g., `['type']`) whose presence on the document block avoids the need for a `@description`. Defaults to an array with `inheritdoc`. If you set this array, it will overwrite the default, so be sure to add back `inheritdoc` if you wish its presence to cause exemption of the rule. ## Context and settings | | | | -------- | ---------------------- | | Context | `ArrowFunctionExpression`, `FunctionDeclaration`, `FunctionExpression`; others when `contexts` option enabled | | Tags | `description` or JSDoc block | | Aliases | `desc` | | Recommended | false | | Options |`checkConstructors`, `checkGetters`, `checkSetters`, `contexts`, `descriptionStyle`, `exemptedBy`| | Settings | `ignoreReplacesDocs`, `overrideReplacesDocs`, `augmentsExtendsReplacesDocs`, `implementsReplacesDocs` | ## Failing examples The following patterns are considered problems: ````ts /** * */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"any"}] // Message: Missing JSDoc block description or @description declaration. /** * */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"body"}] // Message: Missing JSDoc block description. /** * @desc Not a blank description */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"body"}] // Message: Remove the @desc tag to leave a plain block description or add additional description text above the @desc line. /** * @description Not a blank description */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"body"}] // Message: Remove the @description tag to leave a plain block description or add additional description text above the @description line. /** * */ class quux { } // "jsdoc/require-description": ["error"|"warn", {"contexts":["ClassDeclaration"],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * */ class quux { } // Settings: {"jsdoc":{"contexts":["ClassDeclaration"]}} // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * */ // "jsdoc/require-description": ["error"|"warn", {"contexts":["any"],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * @description */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] // Message: Missing JSDoc @description description. /** * */ interface quux { } // "jsdoc/require-description": ["error"|"warn", {"contexts":["TSInterfaceDeclaration"],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * */ var quux = class { }; // "jsdoc/require-description": ["error"|"warn", {"contexts":["ClassExpression"],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * */ var quux = { }; // "jsdoc/require-description": ["error"|"warn", {"contexts":["ObjectExpression"],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * @someDesc */ function quux () { } // Settings: {"jsdoc":{"tagNamePreference":{"description":{"message":"Please avoid `{{tagName}}`; use `{{replacement}}` instead","replacement":"someDesc"}}}} // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] // Message: Missing JSDoc @someDesc description. /** * @description */ function quux () { } // Settings: {"jsdoc":{"tagNamePreference":{"description":false}}} // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] // Message: Unexpected tag `@description` /** * @description */ function quux () { } // Settings: {"jsdoc":{"tagNamePreference":{"description":false}}} // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"any"}] // Message: Missing JSDoc block description or @description declaration. /** * */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"exemptedBy":["notPresent"]}] // Message: Missing JSDoc block description. class TestClass { /** * */ constructor() { } } // Message: Missing JSDoc block description. class TestClass { /** * */ constructor() { } } // "jsdoc/require-description": ["error"|"warn", {"checkConstructors":true}] // Message: Missing JSDoc block description. class TestClass { /** * */ get Test() { } } // Message: Missing JSDoc block description. class TestClass { /** * */ get Test() { } } // "jsdoc/require-description": ["error"|"warn", {"checkGetters":true}] // Message: Missing JSDoc block description. class TestClass { /** * */ set Test(value) { } } // Message: Missing JSDoc block description. class TestClass { /** * */ set Test(value) { } } // "jsdoc/require-description": ["error"|"warn", {"checkSetters":true}] // Message: Missing JSDoc block description. /** * */ class Foo { /** * */ constructor() {} /** * */ bar() {} } // "jsdoc/require-description": ["error"|"warn", {"checkConstructors":false,"contexts":["MethodDefinition"]}] // Message: Missing JSDoc block description. /** * @implements {Bar} */ class quux { } // Settings: {"jsdoc":{"implementsReplacesDocs":false}} // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=\"\"]:has(JsdocTag[rawType=\"Bar\"])","context":"ClassDeclaration"}],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * Has some * description already. * @implements {Bar} */ class quux { } // Settings: {"jsdoc":{"implementsReplacesDocs":false}} // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=\"\"]:has(JsdocTag[rawType=\"Bar\"])","context":"ClassDeclaration"}],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * @implements {Bar * | Foo} */ class quux { } // Settings: {"jsdoc":{"implementsReplacesDocs":false}} // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=\"\"]:has(JsdocTypeUnion > JsdocTypeName[value=\"Bar\"]:nth-child(1))","context":"ClassDeclaration"}],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * @implements {Bar} */ class quux { } // Settings: {"jsdoc":{"implementsReplacesDocs":false}} // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=\"\"]:has(JsdocTag[tag=\"implements\"])","context":"ClassDeclaration"}],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. /** * @implements {Bar} */ class quux { } // Settings: {"jsdoc":{"implementsReplacesDocs":false}} // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=\"\"]:has(JsdocTag[tag=\"implements\"])","context":"any"}],"descriptionStyle":"tag"}] // Message: Missing JSDoc @description declaration. app.use( /** @type {express.ErrorRequestHandler} */ (err, req, res, next) => { // foo } ); // Message: Missing JSDoc block description. app.use( /** @type {express.ErrorRequestHandler} */ ( (err, req, res, next) => { // foo } ) ); // Message: Missing JSDoc block description. /** @type {TreeViewItemData[]} */ this.treeViewSelection = []; // "jsdoc/require-description": ["error"|"warn", {"contexts":["AssignmentExpression"]}] // Message: Missing JSDoc block description. ```` ## Passing examples The following patterns are not considered problems: ````ts /** * */ /** * @description * // arbitrary description content */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] /** * @description * quux(); // does something useful */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] /** * @description Valid usage * quux(); // does something useful * * @description Invalid usage * quux('random unwanted arg'); // results in an error */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] /** * */ class quux { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] /** * */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"contexts":["ClassDeclaration"]}] /** * @type {MyCallback} */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"exemptedBy":["type"]}] /** * */ interface quux { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] interface quux { /** * If the thing should be checked. */ checked?: boolean } // "jsdoc/require-description": ["error"|"warn", {"contexts":["TSPropertySignature"]}] /** * */ var quux = class { }; // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] /** * */ var quux = { }; // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] /** * Has an implicit description */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"body"}] /** * Has an implicit description */ function quux () { } /** * Has an implicit description */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"any"}] /** * @description Has an explicit description */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"any"}] /** * */ function quux () { } // Settings: {"jsdoc":{"tagNamePreference":{"description":false}}} class TestClass { /** * Test. */ constructor() { } } class TestClass { /** * */ constructor() { } } // "jsdoc/require-description": ["error"|"warn", {"checkConstructors":false}] class TestClass { /** * Test. */ get Test() { } } class TestClass { /** * */ get Test() { } } // "jsdoc/require-description": ["error"|"warn", {"checkGetters":false}] class TestClass { /** * Test. */ set Test(value) { } } class TestClass { /** * */ set Test(value) { } } // "jsdoc/require-description": ["error"|"warn", {"checkSetters":false}] /** * Multi * line */ function quux () { } /** Single line */ function quux () { } /** @description something */ function quux () { } // "jsdoc/require-description": ["error"|"warn", {"descriptionStyle":"tag"}] /** * @implements {Bar} */ class quux { } // Settings: {"jsdoc":{"implementsReplacesDocs":false}} // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=/\\s{4}/]:has(JsdocTag[rawType=\"class\"])","context":"ClassDeclaration"}],"descriptionStyle":"tag"}] /** * Has some * description already. */ class quux { } // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=\"\"]:has(JsdocTag[rawType=\"{Bar}\"])","context":"ClassDeclaration"}],"descriptionStyle":"tag"}] /** * Has some * description already. */ class quux { } // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=\"\"]:has(JsdocTag[rawType=\"{Bar}\"])","context":"any"}],"descriptionStyle":"tag"}] /** * Has some * description already. */ // "jsdoc/require-description": ["error"|"warn", {"contexts":[{"comment":"JsdocBlock[postDelimiter=\"\"]:has(JsdocTag[rawType=\"{Bar}\"])","context":"any"}],"descriptionStyle":"tag"}] ````