MDX сочетает в себе возможности Markdown и JSX, предоставляя гибкую платформу для создания контента с динамическими компонентами. При работе с MDX важно понимать, как TypeScript и типизация JavaScript взаимодействуют с MDX, чтобы обеспечить корректность и предсказуемость поведения компонентов.
MDX-файлы могут содержать как обычный Markdown, так и JSX-компоненты. Основные типы данных:
Для корректной работы с TypeScript в проекте рекомендуется
использовать тип MDXContent, который экспортируется из
пакета @mdx-js/react или @mdx-js/mdx. Пример
типизации:
import { MDXContent } from 'mdx/types';
const Content: MDXContent = ({ components }) => (
<div>
<h1>Пример MDX контента</h1>
</div>
);
Компоненты в MDX могут получать набор стандартных и пользовательских props. Основной интерфейс описывается следующим образом:
import { MDXProviderComponents } from '@mdx-js/react';
interface CustomComponents extends MDXProviderComponents {
MyButton?: React.FC<{ label: string; onClick: () => void }>;
Highlight?: React.FC<{ color?: string }>;
}
MDXProviderComponents — базовый интерфейс, включающий
стандартные HTML-элементы (h1, p,
ul, li, a и т.д.).MDX позволяет передавать props напрямую в компоненты. С помощью TypeScript можно строго типизировать эти props:
type AlertProps = {
type: 'success' | 'error';
message: string;
};
const Alert: React.FC<AlertProps> = ({ type, message }) => (
<div className={`alert alert-${type}`}>{message}</div>
);
В MDX:
<Alert type="success" message="Операция выполнена успешно" />
TypeScript обеспечит проверку допустимых значений type и
обязательного наличия message.
MDX поддерживает frontmatter в формате YAML. Для работы с ним также полезна типизация:
interface Frontmatter {
title: string;
date: string;
tags?: string[];
}
const metadata: Frontmatter = {
title: 'Пример MDX',
date: '2026-03-23',
tags: ['typescript', 'mdx', 'react']
};
Использование строгих интерфейсов предотвращает ошибки при извлечении данных из frontmatter и позволяет интегрировать его с системами рендеринга статических страниц.
MDXProviderMDXProvider позволяет переопределять стандартные
HTML-элементы в MDX. Типизация компонентов гарантирует безопасность при
передаче props:
import { MDXProvider } from '@mdx-js/react';
const components: CustomComponents = {
h1: (props) => <h1 style={{ color: 'blue' }} {...props} />,
MyButton: ({ label, onClick }) => <button onCl ick={onClick}>{label}</button>
};
<MDXProvider components={components}>
<Content />
</MDXProvider>
Преимущество такой типизации заключается в том, что ошибки в структуре компонентов будут выявлены на этапе компиляции.
MDX-файлы часто импортируются динамически. Чтобы корректно работать с ними в TypeScript, создаются декларации модулей:
declare module '*.mdx' {
import { MDXComponent } from '@mdx-js/react';
const content: MDXComponent;
export default content;
}
Это позволяет писать:
import Page from './page.mdx';
<Page />
И получать поддержку автодополнения и проверку типов для передаваемых props.
Для сложных проектов удобно создавать универсальные интерфейсы для всех MDX-файлов:
interface MDXPage<Props = {}> {
default: React.FC<Props>;
frontmatter: Frontmatter;
}
Такой подход позволяет:
Типы и интерфейсы являются ключевым инструментом при работе с MDX, особенно в профессиональных проектах с большим количеством контента и компонентов.