Перейти к основному содержимому

TypeScript

Что такое TypeScript и JavaScript

JavaScript — язык программирования в браузере и в Node.js. В "Вселенной IT" на нём написаны React-компоненты, конфиги Docusaurus, remark-плагины и ESM-скрипты в scripts/. Подробнее — основы JavaScript и экосистема JS.

TypeScript — надстройка над JavaScript со статической типизацией. Компилятор tsc и TS server проверяют совместимость данных до запуска в браузере, IDE подсказывает поля и сигнатуры. TypeScript стирается при сборке — в продакшен-бандл попадает обычный JS. Обзор в энциклопедии — TypeScript в курсе JS, углублённо — типы и типизация.

В it-knowledge-base большая часть UI остаётся на JSX, TypeScript подключён для типобезопасности в swizzle-теме, утилитах дизайна и постепенной миграции. Сборку ведёт Docusaurus (Babel/SWC через Webpack или Rspack), отдельный tsc --emit для деплоя не нужен.


Как настраивается TypeScript в проекте

Точка входа — tsconfig.json в корне репозитория. Файл говорит компилятору, какие файлы анализировать, какие версии JS и DOM считать доступными, как обрабатывать JSX и модули.

Дополнительные слои типов.

ФайлРоль
tsconfig.jsonОсновные compilerOptions
src/types.d.tsСсылки на типы Docusaurus (@docusaurus/module-type-aliases)
src/docusaurus-shims.d.tsЗаглушки для @theme/*, html2canvas, jspdf
package.jsondevDependenciestypescript, @types/react, @types/node

Запуск проверки вручную (в IDE TS server делает это постоянно).

npx tsc --noEmit

Официальная npm run build не вызывает tsc — падение сборки из-за типов возможно только после добавления шага CI с tsc --noEmit.


tsconfig.json

{
"compilerOptions": {
"target": "ES2020",
"lib": ["DOM", "DOM.Iterable", "ES2020"],
"module": "ESNext",
"moduleResolution": "Bundler",
"jsx": "react-jsx",
"allowJs": true,
"checkJs": false,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"skipLibCheck": true,
"strict": false,
"types": ["node", "@docusaurus/module-type-aliases"]
},
"include": ["src/**/*", "docusaurus.config.js", "sidebars.js"]
}

Справочник по полям в энциклопедии — tsconfig в справочнике 301, форматы и подключение TS.


compilerOptions — разбор

ОпцияЗначениеПрактический смысл
targetES2020Версия JS, на которую ориентируется проверка (реальную транспиляцию делает Babel/SWC)
libDOM, DOM.Iterable, ES2020Какие встроенные API TypeScript "знает" — document, fetch, итераторы
moduleESNextСинтаксис ESM import/export
moduleResolutionBundlerРазрешение импортов как у Vite/Webpack — без расширений .js
jsxreact-jsxJSX runtime React 17+ — import React в каждом TSX необязателен
allowJstrueРядом с .ts/.tsx можно держать .js/.jsx
checkJsfalseJS-файлы в анализ типов не входят
resolveJsonModuletrueimport data from './file.json' с типами
isolatedModulestrueКаждый файл — отдельный модуль для Babel/SWC (без const enum и т.п.)
noEmittruetsc не пишет .js на диск — только проверка и подсказки
skipLibChecktrueНе проверять .d.ts в node_modules — быстрее
strictfalseМягкий режим — меньше трения при миграции
typesnode, @docusaurus/module-type-aliasesПодключаемые глобальные пакеты типов

lib и библиотеки

lib в compilerOptions — список встроенных определений TypeScript (DOM, ES2020…). Это отдельный слой от npm-пакетов; он описывает window, Promise, Map и т.д.

Библиотеки в смысле npm — @types/react, @types/node из devDependencies. Поле types ограничивает, какие @types/* подтягиваются автоматически; остальные подключаются через import или /// <reference types="..." />.

isolatedModules и модули

isolatedModules: true согласует TypeScript с Babel/SWC, которые транспилируют файл за файлом, без полного графа проекта. Запрещает конструкции, требующие анализа всего проекта (например, const enum без preserveConstEnums).

Модули в src/ — в основном ESM (import/export). Исключение — осознанный require в swizzle-TSX для части @theme/* (компромисс ниже).

strict и types

strict: falsestrictNullChecks, noImplicitAny и другие флаги строгости выключены. Типобезопасность есть там, где явно описаны interface и type; остальной код мигрирует постепенно. Цель — включить strict: true, когда ядро swizzle-темы без слабых any.

types — белый список глобальных деклараций. @docusaurus/module-type-aliases даёт типы для алиасов @site, @theme, @generated.

include

"include": ["src/**/*", "docusaurus.config.js", "sidebars.js"]

Проверяются исходники src/, корневой конфиг и sidebars.js. Папка docs/ вне include — статьи типизируются через MDX без TS-компиляции отдельно от Docusaurus.

noEmit и tsc --emit

РежимКомандаРезультат
Проверка без выводаtsc --noEmitТолько диагностика; совпадает с noEmit: true в config
Эмит JS на дискtsc (без noEmit)Папка с .jsв проекте не используется для сайта
Сборка сайтаnpm run buildDocusaurus + Webpack, TypeScript стирается Babel/SWC

tsc --emit в быту — любой запуск компилятора с записью файлов. В it-knowledge-base включён noEmit — TypeScript только для IDE, CI и рефакторинга; артефакты сборки создаёт Docusaurus.


Babel, SWC и сборка

Docusaurus 3 транспилирует .ts/.tsx/.jsx через цепочку сборщика (Webpack/Rspack), без отдельного шага tsc --emit.

СлойРоль
Webpack / RspackГраф зависимостей, чанки, бандл
Babel (по умолчанию)JSX → JS, современный синтаксис → целевой браузер
SWC через @docusaurus/fasterУскоренная транспиляция при future.experimental_faster

TypeScript здесь — исходный формат; типы удаляются при транспиляции. См. архитектура компиляции TS.


Форматы .ts / .tsx и JSX

РасширениеСодержимоеГде в проекте
.js / .jsxJavaScript + JSX~49 компонентов в src/components/, remark, clientModules
.tsЛогика без разметкиitDesignTheme.ts, articleMetaEnhancement.ts, тесты
.tsxTypeScript + JSXsrc/theme/**, DesignThemePicker

JSX

JSX — синтаксис разметки внутри JavaScript (<div>, <ArticlePdfExport />). Сборщик превращает его в вызовы React.createElement или в automatic JSX runtime. Учебник — React, компоненты и JSX.

JSX runtime

Опция "jsx": "react-jsx" включает новый JSX transform (React 17+). Компилятор сам подключает функции из react/jsx-runtime, поэтому в TSX часто достаточно import {type ReactNode} from 'react' без import React.


Алиасы путей

Docusaurus и Webpack задают виртуальные префиксы; типы — в @docusaurus/module-type-aliases и docusaurus-shims.d.ts.

ИмпортРазрешается в
@site/src/components/Foosrc/components/Foo
@theme/DocItem/Layoutsrc/theme/DocItem/Layout или оригинал из node_modules
@theme-original/*Несвиззленный компонент темы
@generated/...Артефакты сборки Docusaurus (маршруты, registry)

Пример из swizzle-темы.


import lazyDemo from '@site/src/components/shared/lazyDemo';
import {useDoc} from '@docusaurus/plugin-content-docs/client';
import type {Props} from '@theme/Navbar/ColorModeToggle';

Алиас (@site, @theme) — короткий стабильный путь вместо длинных относительных ../../../. IDE и tsc понимают их через пакет типов Docusaurus.

Vite / Webpack

Webpack — сборщик Docusaurus по умолчанию (статья про экосистему JS). Vite — альтернативный dev/build-инструмент в других стеках; опция moduleResolution: "Bundler" в tsconfig отражает правила таких сборщиков (импорт без .ts в пути). В проекте с IT_DOCUSAURUS_FASTER=1 часть пайплайна уходит на Rspack + SWC.

Артефакты сборки

Папка build/ после npm run build — HTML, JS, CSS для продакшена. Промежуточно Docusaurus пишет в .docusaurus/ — сгенерированные маршруты, registry компонентов; префикс @generated/ в импортах указывает на эти файлы. Это артефакты плагинов Docusaurus, отдельно от вывода tsc.


Где уже TypeScript

ОбластьФайлыЗачем TS
src/theme/~19 .tsxSwizzle layout, navbar, sidebar, DocSearch
src/utils/itDesignTheme.tsДизайн-темы, типы из JSON
src/components/DesignThemePicker/index.tsxUI выбора дизайна с типами
src/theme/DocItem/Layout/articleMetaEnhancement.ts, articleSectionEnhancement.tsDOM-утилиты статьи
ТестыarticleSectionEnhancement.test.tsЛогика без полного E2E

Остальные ~49 компонентов в src/components/.jsx / .js. Статьи в docs/ — MDX без TS.

Типизированная утилита дизайна

// src/utils/itDesignTheme.ts
export type ItDesignMode = 'light' | 'dark';

export interface ItDesign {
id: string;
name: string;
mode: ItDesignMode;
featured?: boolean; // опциональность
}

export function applyItDesign(designId: string): ItDesign {
// ...
}

itDesigns.json импортируется благодаря resolveJsonModule: true; литерал as ItDesign[] связывает JSON с интерфейсом.


docusaurus-shims.d.ts

Файл src/docusaurus-shims.d.ts объявляет модули без готовых @types/*.

  • @theme/*, @theme-original/* — fallback ComponentType<any> и Props
  • html2canvas, jspdf — минимальные сигнатуры для PDF
  • глобальный namespace JSX — запасной вариант для сред без @types/react

При новой JS-библиотеке без типов — declare module 'имя-пакета' или установка @types/имя-пакета.

src/types.d.ts.

/// <reference types="@docusaurus/module-type-aliases" />
/// <reference types="@docusaurus/plugin-content-docs/client" />

Подключает типы алиасов и клиента docs (в т.ч. useDoc).


Swizzle-тема и props

Команда swizzle копирует компоненты @docusaurus/theme-classic в src/theme/. В проекте swizzle уже выполнен; новые правки — в .tsx с явными props.


import type {Props} from '@theme/Navbar/ColorModeToggle';

export default function NavbarColorModeToggle({className}: Props): ReactNode {
// ...
}

Props — контракт входных данных компонента. type Props из @theme/... наследует оригинальную сигнатуру темы — при обновлении Docusaurus расхождения видны в IDE.

CJS-компоненты и require

В DocItem/Layout/index.tsx часть модулей темы подключают через requireкомпромисс между ESM-синтаксисом файла и тем, как Docusaurus резолвит некоторые @theme/* в runtime.

// eslint-disable-next-line @typescript-eslint/no-require-imports
const DocItemContent = require('@theme/DocItem/Content').default;

CommonJS (require) и ESM (import) сосуществуют в одном TSX; для типов можно использовать typeof import('@theme/DocItem/Content').default.


lazyDemo и ленивая загрузка

src/components/shared/lazyDemo.js — обёртка над React.lazy + Suspense для тяжёлых блоков (PDF, блок "См. также", hero).

export default function lazyDemo(importFn) {
const LazyComponent = lazy(importFn);
return function LazyDemo(props) {
return (
<Suspense fallback={demoSkeletonFallback()}>
<LazyComponent {...props} />
</Suspense>
);
};
}

В TSX layout.

const TechArticleHero = lazyDemo(
() => import('@site/src/components/TechArticleHero'),
);
const ArticlePdfExport = lazyDemo(() => import('@site/src/components/ArticlePdfExport'));

Ленивая загрузка — отдельный async-чанк подгружается при первом рендере компонента, отдельно от главного бандла. См. lazy-import в конфиге.


useDoc

useDoc — React-хук из @docusaurus/plugin-content-docs/client. Возвращает метаданные текущей статьиmetadata, frontMatter, toc.

function useDocTOC() {
const {frontMatter, toc} = useDoc();
const hidden = frontMatter.hide_table_of_contents;
const canRender = !hidden && toc.length > 0;
// ...
}

Используется в DocItem/Layout/index.tsx, TechArticleHero.jsx, ArticleRelated.jsx. В TSX поля frontMatter частично типизированы через пакет плагина docs; кастомные поля (теги, slug) остаются расширяемыми.


MDX и TypeScript

Статьи в docs/ пишутся без TS. Типизация MDX-компонентов опциональна.

  1. JSDoc в .jsx (быстрый путь).
/**
* @param {{ example?: string, title: string, minHeight?: number }} props
*/
function ExternalPlayEmbedInner({example, title, minHeight = 320}) {
  1. Переписать компонент в .tsx и импортировать из MDX как раньше.

  2. Оставить JSX — достаточно для стабильного API компонентов.


Стратегия миграции

  1. Новый код в src/theme/ — сразу .tsx (layout, navbar, sidebar — максимум пользы от типов).
  2. Компоненты статей.jsx, пока API стабилен; TS при крупном рефакторинге.
  3. strict: true — когда swizzle-ядро без слабых any.
  4. Тесты.test.ts рядом с enhancement-модулями (логика DOM без полного Docusaurus).
  5. remark / scripts — остаются .js / .mjs; типы через JSDoc или постепенный .ts.

TS server

TypeScript Server (tsserver) — фоновый процесс IDE (VS Code, Cursor). Читает tsconfig.json, строит граф проекта, отдаёт автодополнение, переход к определению и подсветку ошибок. Подробнее — статья TS Server.

Если после смены алиасов импорт @site/... подсвечивается как ошибка — перезапустить TS server (Command Palette → "TypeScript: Restart TS Server").


Частые проблемы

СимптомРешение
Cannot find module @site/...Проверить путь; перезапустить TS server
ReactNode vs JSX.ElementДля children предпочитать ReactNode
Ошибка импорта JSONresolveJsonModule: true уже в config
require в TSXeslint-disable или тип через typeof import
Типы @theme/Props = anyУточнить swizzle или дописать shim

Глоссарий

TypeScript

Язык с надстройкой типов над JavaScript; в проекте — проверка и IDE, сборка через Docusaurus.

JavaScript

Базовый язык runtime; JSX-компоненты, конфиги, remark, большинство src/components/.

JSX

Синтаксис UI в .js/.jsx/.tsx; компилируется в вызовы React. См. React и JSX.

Типобезопасность

Свойство кода, при котором несовместимые операции отлавливаются до выполнения (статическая проверка). В TS — через типизацию и strict.

Swizzle-тема

Кастомные копии компонентов @docusaurus/theme-classic в src/theme/, преимущественно .tsx.

Утилита

Вспомогательный модуль без UI — itDesignTheme.ts, articleMetaEnhancement.ts, lazyDemo.js.

Дизайн

Визуальные темы оформления (data-design, itDesigns.json); типы в ItDesign, UI в DesignThemePicker.

Миграция

Постепенный перевод .jsx.tsx и ужесточение strict.

Сборка

npm run build → Docusaurus → Webpack/Rspack → build/. Отдельный emit tsc не используется.

Babel/SWC

Транспиляторы JS/TS/JSX в бандл; типы стираются.

tsconfig.json

Конфиг компилятора TypeScript — compilerOptions, include.

compilerOptions

Секция настроек внутри tsconfig.json.

lib

Список встроенных API (DOM, ES2020) для проверки типов.

isolatedModules

Режим "один файл — один модуль" для совместимости с Babel/SWC.

strict

Набор строгих проверок TypeScript; в проекте false на время миграции.

types

Поле compilerOptions.types — какие @types пакеты видны глобально.

include

Маска файлов проекта для tsc и TS server.

JSX runtime

Automatic transform React 17+; включается "jsx": "react-jsx".

Vite/Webpack

Сборщики модулей; Docusaurus использует Webpack/Rspack, moduleResolution: "Bundler" отражает их правила.

Алиасы

Префиксы @site, @theme, @generated вместо относительных путей.

Артефакты сборки

build/, .docusaurus/, @generated/* — выход Docusaurus, не tsc.

lazyDemo

Хелпер React.lazy + Suspense для отложенной загрузки тяжёлых компонентов.

Ленивая загрузка

Загрузка JS-чанка по требованию при первом показе компонента.

useDoc

Хук Docusaurus — метаданные и toc текущего документа.

Типизация

Процесс и результат описания типов данных в коде. См. типизация в TS.

Типизированные утилиты

Функции и интерфейсы в .ts с явными сигнатурами (ItDesign, applyItDesign).

Правка

Изменение swizzle-файлов в src/theme/ — предпочтительно в .tsx с типами props.

props

Входные параметры React-компонента; в swizzle часто type Props из @theme/....

CJS-компоненты

Модули CommonJS, подключаемые через require().default в TSX.

require

Функция CommonJS для загрузки модуля; компромисс в layout.

Компромисс

Осознанное смешение import и require ради совместимости с резолвом темы Docusaurus.

Опциональность

Поле с ? в interface (featured?: boolean) — может отсутствовать.

TS server

tsserver в IDE — автодополнение, диагностика, навигация по типам.

noEmit

tsc не записывает .js; только проверка типов.

tsc --emit

Запуск компилятора с выводом JS-файлов; в проекте не применяется для сайта.

Проверка типов

npx tsc --noEmit или диагностика TS server. См. package.json и стек.


Связь с другими главами

Полезные статьи энциклопедии