PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Миграция с JavaScript на TypeScript: пошаговое руководство

    Миграция с JavaScript на TypeScript: пошаговое руководство

    Аватар автора Миграция с JavaScript на TypeScript: пошаговое руководство

    Антон Ларичев

    Иконка календаря25 марта 2026
    javascripttypescriptmiddleИконка уровня middle
    Картинка поста Миграция с JavaScript на TypeScript: пошаговое руководство

    Введение

    Миграция с JavaScript на TypeScript — один из самых частых запросов в современных командах разработки. Статическая типизация помогает находить ошибки на этапе компиляции, улучшает автодополнение в редакторе и делает рефакторинг безопасным. Но многие разработчики откладывают перевод проекта на TypeScript, потому что боятся сломать рабочий код или потратить недели на переписывание.

    На самом деле миграция с JavaScript на TypeScript может быть постепенной и безболезненной. TypeScript — это надмножество JavaScript, и каждый валидный JS-файл уже является валидным TS-файлом. Это значит, что вам не нужно переписывать весь проект за один день. В этом руководстве мы разберём пошаговый план перехода, который позволит продолжать разработку новых фич параллельно с миграцией.

    Подготовка проекта к переходу на TypeScript

    Первый шаг — установка TypeScript и создание файла конфигурации. Это не затронет существующий код и не повлияет на работу приложения.

    # Установка TypeScript как dev-зависимости
    npm install --save-dev typescript
    
    # Создание базового tsconfig.json
    npx tsc --init
    

    Как настроить tsconfig для миграции

    Ключевой момент — правильная настройка tsconfig.json. На начальном этапе не включайте строгий режим, иначе компилятор выдаст сотни ошибок сразу. Начните с мягких настроек:

    {
      "compilerOptions": {
        "target": "ES2020",
        "module": "commonjs",
        "lib": ["ES2020"],
        "outDir": "./dist",
        "rootDir": "./src",
        "allowJs": true,
        "checkJs": false,
        "strict": false,
        "esModuleInterop": true,
        "skipLibCheck": true,
        "forceConsistentCasingInFileNames": true,
        "resolveJsonModule": true,
        "declaration": true
      },
      "include": ["src/**/*"],
      "exclude": ["node_modules", "dist"]
    }
    

    Обратите внимание на allowJs: true — это позволяет TypeScript-компилятору обрабатывать как .ts, так и .js файлы. Вы можете переименовывать файлы по одному, не ломая сборку.

    Постепенная миграция файлов: пошаговый план

    Не пытайтесь переименовать все файлы разом. Правильная стратегия — постепенная миграция, файл за файлом, начиная с ядра приложения.

    Шаг 1: Определите порядок миграции

    Начинайте с файлов, от которых зависят другие модули — утилиты, типы данных, конфигурация. Так типизация начнёт распространяться по проекту естественным образом.

    // utils/validation.ts — начинаем с утилит
    export function isEmail(value: string): boolean {
      const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
      return pattern.test(value);
    }
    
    export function isEmpty(value: unknown): boolean {
      if (value === null || value === undefined) return true;
      if (typeof value === 'string') return value.trim().length === 0;
      if (Array.isArray(value)) return value.length === 0;
      return false;
    }
    

    Шаг 2: Создайте интерфейсы для основных сущностей

    Определите типы и интерфейсы для ключевых объектов вашего приложения в отдельной директории:

    // types/user.ts — описываем основные сущности
    export interface User {
      id: number;
      email: string;
      name: string;
      role: 'admin' | 'user' | 'moderator';
      createdAt: Date;
    }
    
    export interface CreateUserDto {
      email: string;
      name: string;
      password: string;
    }
    

    Шаг 3: Переименовывайте и типизируйте

    Переименуйте файл из .js в .ts и добавьте аннотации типов. На начальном этапе допустимо использовать any для сложных мест, но фиксируйте такие места комментарием:

    // service/user.service.ts
    import { User, CreateUserDto } from '../types/user';
    
    export class UserService {
      // TODO: типизировать после миграции database.js
      private db: any;
    
      constructor(database: any) {
        this.db = database;
      }
    
      async findById(id: number): Promise<User | null> {
        return this.db.query('SELECT * FROM users WHERE id = $1', [id]);
      }
    
      async create(dto: CreateUserDto): Promise<User> {
        const { email, name, password } = dto;
        return this.db.query(
          'INSERT INTO users (email, name, password) VALUES ($1, $2, $3) RETURNING *',
          [email, name, password]
        );
      }
    }
    

    Добавление типов для сторонних библиотек

    Многие npm-пакеты уже поставляются с встроенными определениями типов. Для остальных существует репозиторий DefinitelyTyped с пакетами @types/*:

    # Установка типов для популярных библиотек
    npm install --save-dev @types/node @types/express @types/lodash
    

    Если для библиотеки нет готовых типов, создайте файл декларации:

    // types/custom-lib.d.ts — декларация для библиотеки без типов
    declare module 'custom-lib' {
      export function doSomething(input: string): Promise<string>;
    }
    

    Включение строгого режима после миграции

    Когда большинство файлов переведены на TypeScript, пора включать строгие проверки. Делайте это поэтапно, добавляя по одному флагу:

    {
      "compilerOptions": {
        "strict": false,
        "noImplicitAny": true,
        "strictNullChecks": true,
        "strictFunctionTypes": true
      }
    }
    

    Включайте флаги по одному, исправляя ошибки после каждого. Порядок включения:

    1. noImplicitAny — запрещает неявный тип any
    2. strictNullChecks — запрещает null и undefined там, где они не ожидаются
    3. strictFunctionTypes — строгая проверка типов параметров функций
    4. strict: true — включает все проверки разом

    Частые ошибки при переходе с JS на TS

    При миграции с JavaScript на TypeScript разработчики часто допускают одни и те же ошибки:

    Включение strict с первого дня. Строгий режим выдаст сотни ошибок в непереведённых файлах, что демотивирует команду. Начинайте с мягких настроек.

    Использование any повсюду. Тип any отключает проверку типов и сводит на нет преимущества TypeScript. Используйте unknown вместо any, когда тип действительно неизвестен.

    Миграция всего проекта за один раз. Попытка перевести весь проект разом приводит к огромному PR, который невозможно нормально проревьюить. Мигрируйте по модулям.

    Игнорирование автоматических инструментов. Утилита ts-migrate от Airbnb автоматически конвертирует JS-файлы в TS, расставляя any там, где нужна типизация. Это ускоряет начальный этап.

    # Автоматическая миграция через ts-migrate
    npx ts-migrate-full ./src
    

    Заключение

    Миграция с JavaScript на TypeScript — это инвестиция, которая окупается за счёт снижения количества багов, улучшения документации кода и ускорения разработки. Главное правило — мигрируйте постепенно, используйте allowJs для совместимости, начинайте с ядра приложения и включайте строгие проверки только после перевода основных модулей. При таком подходе перевод проекта на TypeScript не потребует остановки разработки и пройдёт без боли для всей команды.

    Иконка глаза456

    Комментарии

    0

    Постройте личный план изучения Основы разработки до уровня Middle — бесплатно!

    Основы разработки — часть карты развития Frontend, Backend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Основы Git

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    HTML и CSS

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    CSS Flexbox

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    бесплатно
    Подробнее

    Похожие статьи

    Картинка поста Паттерны проектирования на TypeScript: SOLID с примерами
    Иконка аватараАнтон
    Иконка календаря13 июня 2026
    typescriptsolidпаттерны проектирования+ 2middleИконка уровня middle

    Паттерны проектирования на TypeScript: SOLID с примерами

    Паттерны проектирования на TypeScript и принципы SOLID: разбор каждого принципа с практическими примерами кода, типичными ошибками и рекомендациями.

    Иконка чипа0
    Иконка глаза342
    Иконка комментариев0
    Картинка поста Git rebase vs merge: когда и как правильно выбирать
    Иконка аватараАнтон
    Иконка календаря23 июня 2026
    gitrebasemerge+ 2middleИконка уровня middle

    Git rebase vs merge: когда и как правильно выбирать

    Git rebase и merge решают одну задачу, но по-разному. Разбираем отличия, сценарии применения и типичные ошибки при работе с ветками.

    Иконка чипа0
    Иконка глаза58
    Иконка комментариев0
    Картинка поста Что такое REST API и как его правильно проектировать
    Иконка аватараАнтон
    Иконка календаря22 июня 2026
    REST APIHTTPbackend+ 2juniorИконка уровня junior

    Что такое REST API и как его правильно проектировать

    REST API — архитектурный стиль для взаимодействия клиента и сервера. Разбираем принципы REST, HTTP-методы, проектирование маршрутов и типичные ошибки.

    Иконка чипа0
    Иконка глаза75
    Иконка комментариев0
    Иконка чипа0