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 не потребует остановки разработки и пройдёт без боли для всей команды.

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

    Комментарии

    0

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

    JavaScript с нуля - основы языка и практика для начинающих — часть карты развития Frontend, Backend, Mobile

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

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

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

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

    Продвинутый JavaScript

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

    TypeScript с нуля

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

    Neovim

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

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

    Картинка поста Сколько стоит Cursor в 2026 и как оплатить из России
    Иконка аватараАнтон
    Иконка календаря17 октября 2026
    AI-инструментыAnthropicapijuniorИконка уровня junior

    Сколько стоит Cursor в 2026 и как оплатить из России

    С 12 октября 2026 года Cursor продаётся в составе The X Subscription — общей подписки на Grok, Cursor и X Premium. Тарифы такие: Free — бесплатно, Plus — $8 в месяц, Premium — $30, Super — $100, Ultra — $200. Модели Claude и GPT в Cursor доступны только с Premium и оплачиваются отдельно, по ценам API. Из России оплатить подписку российской картой нельзя, а модели Claude и GPT Cursor не отдаёт в регионах, которые блокируют их провайдеры. Рабочая схема для России — бесплатный Cursor как редактор и агент Claude Code внутри него с ключом AI для кода от PurpleSchool от 499 ₽ в месяц.

    Иконка чипа0
    Иконка глаза21
    Иконка комментариев0
    Картинка поста Claude без VPN в России: как пользоваться в 2026
    Иконка аватараАнтон
    Иконка календаря16 октября 2026
    AnthropicAI-инструментыClaude CodejuniorИконка уровня junior

    Claude без VPN в России: как пользоваться в 2026

    Сайт claude.ai и приложения Claude из России без VPN не работают: Anthropic не включает Россию в список поддерживаемых регионов и закрывает доступ и к чату, и к API. Без VPN Claude доступен одним способом — через API-посредника, который сам обращается к Anthropic из поддерживаемой страны, а вам выдаёт ключ с оплатой в рублях. Так работает AI для кода от PurpleSchool: ключ подключается к Claude Code, VS Code, Cursor и другим инструментам разработчика, а также к вашему собственному коду. Окно чата как на claude.ai такой способ не даёт — это доступ к модели, а не к сайту.

    Иконка чипа0
    Иконка глаза144
    Иконка комментариев0
    Картинка поста Как настроить CI/CD пайплайн с нуля: полное руководство
    Иконка аватараАнтон
    Иконка календаря14 октября 2026
    CI/CDDevOpsGitHub Actions+ 2middleИконка уровня middle

    Как настроить CI/CD пайплайн с нуля: полное руководство

    CI/CD пайплайн с нуля: как собрать рабочий конвейер сборки, тестов и деплоя на примере GitHub Actions и Docker без лишней теории.

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