Как построить надежный API на Express и TypeScript: пошаговое руководство

freeCodeCamp.org 14,6 тыс. 1 ч 14 мин 4 мин 24.07.2026
Главное

Использование TypeScript в связке с Express значительно повышает безопасность, масштабируемость и удобство поддержки серверных приложений. В данном руководстве Рэйчел, преподаватель платформы Scrimba и автор видео на канале freeCodeCamp.org, пошагово разбирает процесс создания типизированного API для приюта домашних животных.

🛠 Настройка окружения и установка зависимостей 2:08

Процесс начинается со стандартной инициализации Node.js проекта с помощью команды npm init -y . Для работы в среде TypeScript недостаточно просто установить Express; необходимо также добавить типы, так как сама библиотека написана на чистом JavaScript.

Для подготовки рабочего окружения автор устанавливает следующие пакеты:

Конфигурация TypeScript осуществляется через файл tsconfig.json. Вместо ручного написания всех правил Рэйчел рекомендует расширять готовые пресеты с помощью поля extends . В compilerOptions критически важно указать:

🚀 Создание первого сервера и компиляция 7:12

Первый файл сервера создается с расширением .ts (например, index.ts). На этом этапе Рэйчел демонстрирует импорт типов напрямую из библиотеки: import express, { Express, Request, Response } from 'express' . Хотя TypeScript часто способен сам вывести типы (например, для экземпляра приложения app), явное указание типа Express помогает закрепить навыки работы с системой типов .

Поскольку Node.js не умеет исполнять TypeScript напрямую, код необходимо скомпилировать. Для этого используется встроенный компилятор npx tsc . Он анализирует проект и создает папку dist с JS-файлами. Только после этого сервер можно запустить командой node dist/index.js .

Чтобы упростить процесс разработки, Рэйчел предлагает настроить скрипты в package.json :

🐾 Моделирование данных и типизация сущностей 19:25

Для создания реального API требуется структура данных. В примере рассматривается приют для животных, где у каждого питомца есть набор характеристик. Автор переносит данные в отдельный файл source/data/pets.ts для соблюдения модульности .

Ключевым моментом здесь является создание кастомного типа Pet . В процессе разработки типа Рэйчел обращает внимание на использование специфических возможностей TypeScript:

🔍 Глубокая типизация Request и Response 33:01

Одной из самых мощных функций TypeScript в Express является использование дженериков (generics) для объектов запроса и ответа. Типы Request и Response позволяют точно описать, что именно сервер ожидает получить и что он отправит клиенту.

По словам Рэйчел, дженерик для Response позволяет задать структуру тела ответа (Response Body) . Например, если маршрут возвращает список животных, тип будет выглядеть как Response<Pet[]> . Это гарантирует, что разработчик не отправит ошибочные данные.

Объект Request еще более сложен и включает четыре основных параметра :

  1. P: параметры пути (Path Params, например, :id).
  2. ResBody: тело ответа.
  3. ReqBody: тело запроса (для POST/PUT методов).
  4. ReqQuery: параметры строки запроса (Query Params).

🧪 Фильтрация и параметры запроса 41:31

Разработка функционала фильтрации (например, по виду животного или статусу адаптации) требует особого внимания к типам. Рэйчел подчеркивает, что параметры из req.query всегда приходят в виде строк . Если API должно фильтровать данные по булеву значению (adopted) или числу (age), эти значения необходимо парсить вручную.

Для удобства автор создает отдельный тип PetQueryParams, где описывает все возможные фильтры :

🏗 Рефакторинг: Роутеры и Контроллеры 54:05

Когда файл index.ts становится слишком объемным («chunkier», как говорит Рэйчел), проект необходимо реструктурировать. Ведущая демонстрирует стандартный для Express подход разделения ответственности :

  1. Routes: определяют пути (endpoints) и используют express.Router(). Здесь важно импортировать тип Router для типизации самого объекта роутера .
  2. Controllers: содержат бизнес-логику и обработчики. При переносе логики из роутера в контроллер необходимо также переносить и все связанные типы данных и запросов .

Такой подход делает код чистым и масштабируемым, сохраняя при этом полную типизацию всех связей.

🛡 Использование Middleware с TypeScript 1:03:13

Middleware (промежуточное ПО) — это функции, которые выполняются между получением запроса и отправкой ответа. В TypeScript для них предусмотрен специальный тип NextFunction .

Рэйчел приводит два практических примера кастомных middleware:

В завершение курса Рэйчел отмечает, что хотя использование TypeScript добавляет «лишние шаги» (вроде установки типов для сторонних библиотек, таких как cors), это окупается за счет раннего обнаружения ошибок и автоматических подсказок в редакторе (Intellisense) .

💬 Цитаты

«Мы получаем скорость создания API в Express и надежность строгой типизации TypeScript.»

«Мы, программисты, ленивы, поэтому ищем способы облегчить себе жизнь через автоматизацию.»

«TypeScript часто указывает вам верное направление в своих сообщениях об ошибках. А если нет — интернет ваш друг.»

👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Middleware
Функция, имеющая доступ к объектам запроса, ответа и следующей функции в цикле «запрос-ответ».
Generics (Дженерики)
Инструмент TypeScript, позволяющий создавать компоненты, работающие с различными типами, сохраняя при этом строгую типизацию.
Union Types
Тип данных, который позволяет переменной принимать значения нескольких различных типов (например, string | null).
Intellisense
Технология автоматического завершения кода и отображения документации в редакторе.
📊 Цифры
🗓 Хронология
  1. 2026-07-26 Текущая дата (дата публикации материала).
  2. Начало Установка Node.js, Express и TypeScript зависимостей.
  3. Середина Переход от ручной компиляции к автоматизации через npm-скрипты и Runner в Scrimba.
  4. Финал Рефакторинг кода и вынос логики в контроллеры и middleware.
⚖️ Другая сторона
Технологии и IT TypeScript Express Node.js API Middleware