Как написать REST API на TypeScript за 30 минут

Онлайн-тренажер Python для начинающих

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

Начать курс

Введение: Почему TypeScript для REST API?

Современная веб-разработка немыслима без создания эффективных и безопасных API. TypeScript, как надстройка над JavaScript, предлагает статическую типизацию, что значительно снижает количество ошибок во время выполнения и улучшает читаемость кода. В этом руководстве мы покажем, как написать полноценный REST API на TypeScript всего за 30 минут. Вы узнаете, как настроить проект, создать базовые эндпоинты и обработать ошибки. Этот туториал идеально подходит для начинающих разработчиков, которые хотят быстро освоить создание серверных приложений.

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

Первым делом необходимо создать новый проект и установить все необходимые пакеты. Убедитесь, что у вас установлены Node.js (версия 18 или выше) и npm.

Шаг 1: Инициализация проекта

Откройте терминал и выполните следующие команды:

mkdir my-rest-api
cd my-rest-api
npm init -y

Шаг 2: Установка TypeScript и зависимостей

Установите TypeScript, Express и необходимые типы:

npm install express
npm install -D typescript @types/node @types/express ts-node nodemon
  • express — фреймворк для создания сервера.
  • typescript — компилятор TypeScript.
  • @types/express — типы для Express.
  • ts-node — для запуска TypeScript напрямую.
  • nodemon — автоматический перезапуск сервера при изменениях.

Шаг 3: Настройка tsconfig.json

Создайте файл tsconfig.json в корне проекта:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

Создание базового сервера на TypeScript

Теперь создадим структуру папок и основной файл сервера.

Шаг 4: Структура проекта

Создайте папку src и файл src/index.ts:

mkdir src
touch src/index.ts

Шаг 5: Написание сервера

Откройте src/index.ts и добавьте следующий код:

import express, { Request, Response } from 'express';

const app = express();
const PORT = process.env.PORT || 3000;

// Middleware для парсинга JSON
app.use(express.json());

// Базовый маршрут
app.get('/', (req: Request, res: Response) => {
    res.send('REST API на TypeScript работает!');
});

// Запуск сервера
app.listen(PORT, () => {
    console.log(`Сервер запущен на порту ${PORT}`);
});

Шаг 6: Добавление скриптов в package.json

Обновите package.json, добавив скрипты для разработки и сборки:

"scripts": {
  "dev": "nodemon --exec ts-node src/index.ts",
  "build": "tsc",
  "start": "node dist/index.js"
}

Теперь запустите сервер командой npm run dev. Вы должны увидеть сообщение "Сервер запущен на порту 3000".

Реализация CRUD-эндпоинтов

Создадим простую модель данных и реализуем операции создания, чтения, обновления и удаления (CRUD). Для примера возьмем сущность "Задача" (Task).

Шаг 7: Создание модели и хранилища

Создайте файл src/models/Task.ts:

export interface Task {
    id: number;
    title: string;
    completed: boolean;
}

// Временное хранилище в памяти
export const tasks: Task[] = [
    { id: 1, title: 'Изучить TypeScript', completed: false },
    { id: 2, title: 'Написать REST API', completed: false },
];

Шаг 8: Создание маршрутов

Создайте файл src/routes/tasks.ts:

import { Router, Request, Response } from 'express';
import { tasks, Task } from '../models/Task';

const router = Router();

// GET /tasks — получить все задачи
router.get('/', (req: Request, res: Response) => {
    res.json(tasks);
});

// GET /tasks/:id — получить задачу по ID
router.get('/:id', (req: Request, res: Response) => {
    const id = parseInt(req.params.id);
    const task = tasks.find(t => t.id === id);
    if (task) {
        res.json(task);
    } else {
        res.status(404).json({ message: 'Задача не найдена' });
    }
});

// POST /tasks — создать новую задачу
router.post('/', (req: Request, res: Response) => {
    const { title } = req.body;
    if (!title) {
        return res.status(400).json({ message: 'Поле title обязательно' });
    }
    const newTask: Task = {
        id: tasks.length + 1,
        title,
        completed: false,
    };
    tasks.push(newTask);
    res.status(201).json(newTask);
});

// PUT /tasks/:id — обновить задачу
router.put('/:id', (req: Request, res: Response) => {
    const id = parseInt(req.params.id);
    const taskIndex = tasks.findIndex(t => t.id === id);
    if (taskIndex === -1) {
        return res.status(404).json({ message: 'Задача не найдена' });
    }
    const { title, completed } = req.body;
    tasks[taskIndex] = { ...tasks[taskIndex], title, completed };
    res.json(tasks[taskIndex]);
});

// DELETE /tasks/:id — удалить задачу
router.delete('/:id', (req: Request, res: Response) => {
    const id = parseInt(req.params.id);
    const taskIndex = tasks.findIndex(t => t.id === id);
    if (taskIndex === -1) {
        return res.status(404).json({ message: 'Задача не найдена' });
    }
    tasks.splice(taskIndex, 1);
    res.status(204).send();
});

export default router;

Шаг 9: Подключение маршрутов к серверу

Обновите src/index.ts, добавив импорт и использование роутера:

import taskRoutes from './routes/tasks';

// ... после middleware
app.use('/tasks', taskRoutes);

Обработка ошибок и валидация

Для надежного

Блоги

Рекомендаций по книгам