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

Инструменты 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 с горячей перезагрузкой.

script.ts
// 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 и сопоставляет псевдоним @/, а также импорты стилей.

script.ts
// 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

Два теста: один проверяет, что текст кнопки отрисован, другой — что обработчик клика вызывается ровно один раз.

script.ts
// 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