Введение: Почему 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);
Обработка ошибок и валидация
Для надежного