script-setup-jsdoc.md 1.93 KB
title: JSDoc Documentation for Script Setup Components
impact: MEDIUM
impactDescription: enables proper documentation for composition API components
type: capability
tags: jsdoc, script-setup, documentation, composition-api, component

JSDoc Documentation for Script Setup Components

Impact: MEDIUM - enables proper documentation for composition API components

<script setup> doesn't have an obvious place to attach JSDoc comments for the component itself. Use a dual-script pattern.

Problem

Incorrect:

<script setup lang="ts">
/**
 * This comment doesn't appear in IDE hover or docs
 * @component
 */
import { ref } from 'vue'

const count = ref(0)
</script>

JSDoc comments inside <script setup> don't attach to the component export because there's no explicit export statement.

Solution

Use both <script> and <script setup> blocks:

Correct:

<script lang="ts">
/**
 * A counter component that displays and increments a value.
 *
 * @example
 * ```vue
 * <Counter :initial="5" @update="handleUpdate" />
 * ```
 *
 * @component
 */
export default {}
</script>

<script setup lang="ts">
import { ref } from 'vue'

const props = defineProps<{
  /** Starting value for the counter */
  initial?: number
}>()

const emit = defineEmits<{
  /** Emitted when counter value changes */
  update: [value: number]
}>()

const count = ref(props.initial ?? 0)
</script>

How It Works

  • The regular <script> block's default export is merged with <script setup>
  • JSDoc on export default {} attaches to the component
  • Props and emits JSDoc in <script setup> still work normally

What Gets Documented

Location Shows In
export default {} JSDoc Component import hover
defineProps JSDoc Prop hover in templates
defineEmits JSDoc Event handler hover

Reference