diff --git a/docs/content/3.guide/2.displaying/4.typescript.md b/docs/content/3.guide/2.displaying/4.typescript.md
index 019f7aea9..a6bdecbc0 100644
--- a/docs/content/3.guide/2.displaying/4.typescript.md
+++ b/docs/content/3.guide/2.displaying/4.typescript.md
@@ -39,6 +39,27 @@ const { data } = await useAsyncData(
```
+## Markdown Specific Types
+
+If you know the content being fetched will be Markdown, then you can extend the `MarkdownParsedContent`{lang="ts"} type for improved
+type-safety.
+
+```vue
+
+```
+
+
## The future
TypeScript support is a strong focus for us.
diff --git a/src/runtime/markdown-parser/index.ts b/src/runtime/markdown-parser/index.ts
index b310efb70..07c44c69b 100644
--- a/src/runtime/markdown-parser/index.ts
+++ b/src/runtime/markdown-parser/index.ts
@@ -8,7 +8,7 @@ import remarkGfm from 'remark-gfm'
import rehypeSortAttributeValues from 'rehype-sort-attribute-values'
import rehypeSortAttributes from 'rehype-sort-attributes'
import rehypeRaw from 'rehype-raw'
-import { MarkdownOptions, Toc } from '../types'
+import { MarkdownOptions, MarkdownParsedContent, Toc } from '../types'
import { parseFrontMatter } from './remark-mdc/frontmatter'
import { generateToc } from './toc'
import { contentHeading, generateBody } from './content'
@@ -61,7 +61,7 @@ export async function parse (file: string, userOptions: Partial
*/
const heading = contentHeading(body)
- return {
+ return <{ meta: Partial, body: MarkdownParsedContent['body'] }> {
body: {
...body,
toc
diff --git a/src/runtime/server/transformers/markdown.ts b/src/runtime/server/transformers/markdown.ts
index a36f3d5a8..900ff57a7 100644
--- a/src/runtime/server/transformers/markdown.ts
+++ b/src/runtime/server/transformers/markdown.ts
@@ -1,5 +1,6 @@
import { parse } from '../../markdown-parser'
import type { MarkdownOptions } from '../../types'
+import { MarkdownParsedContent } from '../../types'
import { useRuntimeConfig } from '#imports'
const importPlugin = async (p: [string, any]) => ([
@@ -17,7 +18,7 @@ export default {
const parsed = await parse(content, config)
- return {
+ return {
...parsed.meta,
body: parsed.body,
_type: 'markdown',
diff --git a/src/runtime/types.d.ts b/src/runtime/types.d.ts
index f0df92b64..2f01a80d8 100644
--- a/src/runtime/types.d.ts
+++ b/src/runtime/types.d.ts
@@ -103,6 +103,28 @@ export interface Toc {
links: TocLink[]
}
+export interface MarkdownParsedContent extends ParsedContent {
+ _type: 'markdown',
+ /**
+ * Content is empty
+ */
+ _empty: boolean
+ /**
+ * Content description
+ */
+ description: string
+ /**
+ * Content excerpt, generated from content
+ */
+ excerpt?: MarkdownRoot
+ /**
+ * Parsed Markdown body with included table of contents.
+ */
+ body: MarkdownRoot & {
+ toc?: Toc
+ }
+}
+
export interface ContentTransformer {
name: string
extentions: string[]