Инструменты TypeScript
Эта глава — обзор инструментов, которые окружают TypeScript: линтинг, форматирование, инструменты сборки, настройка редактора и тестирование.
Экосистема разработки TypeScript
Инструментарий — одна из самых сильных сторон TypeScript. Для каждого этапа разработки есть хорошие инструменты:
- Качество кода: ESLint с поддержкой TypeScript, проверка типов и линтинг, соблюдение стиля кода.
- Разработка: интеграция с VS Code, инструменты отладки, горячая замена модулей (HMR).
- Сборка и развёртывание: сборщики (Vite, Webpack, Parcel), объединение модулей, оптимизация для продакшена.
Линтинг с помощью ESLint
Установка. Установите ESLint вместе с официальным парсером и плагином для TypeScript, чтобы ESLint понимал синтаксис и правила TypeScript: npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin.
Настройка. В файле .eslintrc.json включите рекомендованные правила TypeScript, укажите ESLint путь к вашему tsconfig для линтинга с учётом типов и настройте несколько распространённых правил:
"root": true"parser": "@typescript-eslint/parser""plugins": ["@typescript-eslint"]"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:@typescript-eslint/recommended-requiring-type-checking"]"parserOptions": { "project": "./tsconfig.json", "ecmaVersion": 2020, "sourceType": "module" }"rules": { "@typescript-eslint/explicit-function-return-type": "warn", "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }] }
NPM-скрипты. Добавьте в package.json скрипты, которые запускают линтер и проверку только типов. Используйте lint:fix, чтобы автоматически исправлять простые проблемы.
"lint": "eslint . --ext .ts,.tsx""lint:fix": "eslint . --ext .ts,.tsx --fix""type-check": "tsc --noEmit"
Форматирование кода с помощью Prettier
Prettier сохраняет одинаковый стиль кода во всей вашей команде.
Сочетайте его с ESLint, чтобы проблемы форматирования не выглядели как ошибки линтера.
Установка. Установите Prettier и те пакеты ESLint, которые отключают конфликтующие правила и сообщают о проблемах форматирования через ESLint: npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier.
Настройка. Запишите свои предпочтения в .prettierrc, например:
"semi": true"singleQuote": true"tabWidth": 2"printWidth": 100"trailingComma": "es5""bracketSpacing": true"arrowParens": "avoid"
А сгенерированные папки перечислите в .prettierignore, по одной в строке: node_modules, build, dist, .next, .vscode.
Интеграция с ESLint. Подключите plugin:prettier/recommended, чтобы о проблемах форматирования сообщал ESLint. В файле .eslintrc.json добавьте его в массив "extends", после всех остальных конфигураций: "extends": ["plugin:prettier/recommended"]. Он должен быть последним элементом массива.
Современные инструменты сборки
Vite — рекомендуемый выбор, если нужен быстрый сервер разработки и современная сборка.
Webpack по-прежнему широко распространён и очень гибко настраивается.
Vite (рекомендуется). Создайте новый проект React + TypeScript с помощью Vite. Он запускает сервер разработки с HMR, чтобы вы быстро видели результат:
npm create vite@latest my-app -- --template react-ts— создать проектcd my-app— перейти в папку проектаnpm install— установить зависимостиnpm run dev— запустить сервер разработки
Настройка Webpack. Если вы выбираете Webpack, эта минимальная конфигурация компилирует TypeScript, обрабатывает CSS и раздаёт приложение через webpack-dev-server.
Настройка TypeScript. Строгий tsconfig.json для современных браузеров. Необязательные baseUrl и paths разрешают абсолютные импорты, такие как @/components/Button. Его compilerOptions:
"target": "es2020""module": "esnext""lib": ["dom", "dom.iterable", "esnext"]"allowJs": true"skipLibCheck": true"esModuleInterop": true"allowSyntheticDefaultImports": true"strict": true"forceConsistentCasingInFileNames": true"moduleResolution": "node""resolveJsonModule": true"isolatedModules": true"noEmit": true"jsx": "react-jsx""baseUrl": ".""paths": { "@/*": ["src/*"] }
вместе с "include": ["src"] и "exclude": ["node_modules"].
Минимальная настройка Webpack
ts-loader обрабатывает файлы .ts/.tsx, CSS проходит через загрузчики style и css, а сервер разработки работает на порту 3000 с горячей перезагрузкой.
// webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.tsx',
module: {
rules: [
{
test: /\.(ts|tsx)$/,
use: 'ts-loader',
exclude: /node_modules/,
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
}),
],
devServer: {
static: path.join(__dirname, 'dist'),
compress: true,
port: 3000,
hot: true,
},
};
Настройка среды разработки
Настройте редактор так, чтобы он показывал ошибки линтера, форматировал код при сохранении и позволял легко отлаживать программу.
Расширения VS Code. Рекомендуемые расширения:
- TypeScript + Webpack Problem Matchers — более понятные сообщения об ошибках
- ESLint — запускает ESLint прямо в VS Code
- Prettier - Code formatter — единообразное форматирование
- Path IntelliSense — автодополнение имён файлов
- Error Lens — показывает ошибки прямо в строке кода
Настройки VS Code. В файле .vscode/settings.json сделайте Prettier форматировщиком по умолчанию, исправляйте проблемы ESLint при сохранении и предпочитайте неотносительные пути импорта:
"editor.defaultFormatter": "esbenp.prettier-vscode""editor.formatOnSave": true"editor.codeActionsOnSave": { "source.fixAll.eslint": true, "source.organizeImports": true }"eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"]"typescript.tsdk": "node_modules/typescript/lib""typescript.preferences.importModuleSpecifier": "non-relative"
Конфигурация отладки. В файле .vscode/launch.json ("version": "0.2.0") добавьте две записи в "configurations":
- Запуск Chrome:
"type": "chrome","request": "launch","name": "Launch Chrome against localhost","url": "http://localhost:3000","webRoot": "${workspaceFolder}","sourceMaps": true, а также"sourceMapPathOverrides", который сопоставляетwebpack:///./~/*с${workspaceFolder}/node_modules/*, аwebpack:///./*с${workspaceFolder}/src/*. - Отладчик тестов на Node:
"type": "node","request": "launch","name": "Debug Tests","runtimeExecutable": "${workspaceRoot}/node_modules/.bin/jest","args": ["--runInBand", "--watchAll=false"],"console": "integratedTerminal","internalConsoleOptions": "neverOpen","sourceMaps": true.
Настройка тестирования
Jest вместе с Testing Library — популярный способ тестировать приложения на React + TypeScript.
Jest + Testing Library. Установите Jest, его поддержку TypeScript и помощники React Testing Library для проверок DOM и имитации действий пользователя: npm install --save-dev jest @types/jest ts-jest @testing-library/react @testing-library/jest-dom @testing-library/user-event.
Настройка Jest. Настройте Jest так, чтобы он использовал ts-jest, сопоставлял CSS-модули и разрешал пути-псевдонимы, такие как @/.
Пример теста. Простой тест компонента, который с помощью Testing Library проверяет отрисовку и поведение при клике.
Настройка Jest
Конфигурация использует пресет ts-jest с окружением jsdom и сопоставляет псевдоним @/, а также импорты стилей.
// jest.config.js
module.exports = {
preset: 'ts-jest',
testEnvironment: 'jsdom',
setupFilesAfterEnv: ['@testing-library/jest-dom'],
moduleNameMapper: {
'^@/(.*)$': '/src/$1',
'\\\.(css|less|scss|sass)$': 'identity-obj-proxy',
},
transform: {
'^.+\\\.tsx?$': 'ts-jest',
},
testMatch: ['**/__tests__/**/*.test.(ts|tsx)'],
};
Тест компонента с Testing Library
Два теста: один проверяет, что текст кнопки отрисован, другой — что обработчик клика вызывается ровно один раз.
// src/__tests__/Button.test.tsx
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import Button from '../components/Button';
describe('Button', () => {
it('renders button with correct text', () => {
render(<Button>Click me</Button>);
expect(screen.getByRole('button', { name: /click me/i })).toBeInTheDocument();
});
it('calls onClick when clicked', () => {
const handleClick = jest.fn();
render(<Button onClick={handleClick}>Click me</Button>);
fireEvent.click(screen.getByRole('button'));
expect(handleClick).toHaveBeenCalledTimes(1);
});
});
Рекомендуемые приёмы
Рабочий процесс разработки:
- Используйте
npm run devдля разработки с горячей перезагрузкой - Запускайте
npm run type-check, чтобы проверить типы TypeScript - Используйте
npm run lint, чтобы найти ошибки линтера - Запускайте
npm run build, чтобы создать сборку для продакшена
Оптимизация производительности:
- Используйте разделение кода с динамическими импортами
- Включайте tree-shaking в сборках для продакшена
- Используйте
React.memoиuseMemoдля тяжёлых вычислений - Загружайте некритичные компоненты лениво
Частые ошибки
- Конфигурация TypeScript: убедитесь, что включён режим
strict - Конфликты ESLint и Prettier: используйте
eslint-config-prettier, чтобы отключить конфликтующие правила - Медленная сборка: рассмотрите Vite или esbuild для более быстрой разработки
- Отсутствующие определения типов: установите пакеты
@typesдля всех зависимостей - Проблемы с отладкой: убедитесь, что карты исходников (source maps) настроены правильно
Рекомендуемые инструменты
- Сборщики: Vite, Webpack, Parcel
- Тестирование: Jest, React Testing Library, Cypress
- Линтинг и форматирование: ESLint, Prettier, Stylelint
- Документация: TypeDoc, Storybook
- Производительность: Web Vitals, Lighthouse