Full JSDoc format guide for TypeScript, covering @example formats (short, multi-line, multi-variant), tag usage (@default, @deprecated, what to avoid), documentation patterns for properties/enums/functions, and tag order.
74
91%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
The detailed JSDoc format guide with examples for every case. The always-on essentials live in
the jsdoc rule. Reach here when you need the full reference.
@example format@example line, code as inline backtick on the next line/**
* @example Required parameter
* `name: Type`
*
* @example Optional parameter
* `name?: Type`
*/@example/**
* @example
* ```ts
* const result = buildParams(node, {
* paramsType: 'inline',
* })
* ```
*/@example blocks/**
* @example Object mode
* `{ id, data, params }: { id: string; data: Data; params?: QueryParams }`
*
* @example Inline mode
* `id: string, data: Data, params?: QueryParams`
*/| Rule | Correct | Incorrect |
|---|---|---|
| Label + inline code | @example Required\n\name: Type`` | @example \name: Type`` (code on tag line) |
| Multi-line code | Fenced ```ts ``` block | Bare code lines without a fence |
| Short examples | Inline backtick | Triple-backtick fence (too heavy) |
| One concern per example | Separate @example blocks | One example covering all cases |
| Tag | Purpose | Notes |
|---|---|---|
@default | Default value | Only when the default is non-obvious (omit for undefined) |
@example | Usage example | Prefer for complex or multi-variant APIs |
@note | Important caveat | Version info, breaking changes |
@deprecated | Mark as deprecated | Include a migration path |
| Tag | Purpose |
|---|---|
@see | Reference external docs |
@internal | Internal API |
@beta | Experimental |
@param: use TypeScript parameter types@returns: use the TypeScript return type@type: use a TypeScript type annotation@typedef: use type or interface@default undefined: optional (?) already implies this/**
* Output directory for generated files.
*/
outDir?: stringNever use single-line /** description */. Always expand to multi-line.
/**
* Maximum number of concurrent callbacks during traversal.
* Higher values overlap I/O-bound work; lower values reduce memory pressure.
*
* @default 30
*/
concurrency?: numberDo not add @default false or @default undefined when the TypeScript type already makes the
default obvious.
/**
* How path parameters are emitted in the function signature.
* - `'object'` groups them as a single destructured parameter
* - `'inline'` spreads them as individual parameters
* - `'inlineSpread'` emits a single rest parameter
*/
pathParamsType: 'object' | 'inline' | 'inlineSpread'names?: {
/**
* Name for the request body parameter.
* @default 'data'
*/
data?: string
/**
* Name for the query parameters group parameter.
* @default 'params'
*/
params?: string
}Only add JSDoc when it adds value beyond the signature:
// No JSDoc needed: the signature is self-explanatory
function camelCase(str: string): string { ... }
// JSDoc adds value: it explains behavior and non-obvious edge cases
/**
* Returns `true` when the schema resolves to a plain string output.
*
* - `string`, `uuid`, `email`, `url`, `datetime` are always plain strings.
* - `date` and `time` are plain strings when their `representation` is `'string'`.
*/
function isStringType(node: SchemaNode): boolean { ... }Do:
@default only when the default is non-obvious@example blocks for different variants@example labels short and descriptiveDo not:
/** description */@default undefined@example line@param or @returns tags@default (if non-obvious)@example (one or more)@note (if needed)@deprecated (if applicable)@see (if providing references)8349acf
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.