TypeScript + Node.js: практическое руководство
TypeScript широко используется в серверной разработке на Node.js. В этом руководстве рассматриваются настройка и использование TypeScript для проектов Node.js.
Использование TypeScript делает код Node.js безопаснее и проще в поддержке, особенно подходит для средних и крупных backend-проектов.
Руководство Node.js: Просмотрhttps://www.example.com/nodejs/nodejs-tutorial.html
SVG-диаграмма: структура проекта Node.js + TypeScript
Почему стоит использовать TypeScript в Node.js
Проекты на Node.js часто включают сложную бизнес-логику и обработку данных, а кодовая база может быстро расти.
Использование TypeScript позволяет: обеспечивать проверку типов во время компиляции, чтобы уменьшить ошибки времени выполнения; использовать интеллектуальные подсказки IDE для повышения эффективности разработки; делать код более простым для чтения и поддержки.
Многие крупные проекты на Node.js (например, NestJS) рекомендуют TypeScript или используют его по умолчанию.
Преимущества:Статическая проверка типов TypeScript может выявлять потенциальные проблемы во время разработки, что эффективнее, чем отладка во время выполнения.
Инициализация проекта
Сначала инициализируйте проект Node.js и установите зависимости, связанные с TypeScript.
Инициализация проекта
npm init -y
# Установка TypeScript и Node.jsОпределения типов
# -D означает установку как dev-зависимости
npm install -D typescript @types/node ts-node nodemon
# Инициализация tsconfig.json
npx tsc --init
Примечания:
@types/nodeПредоставляет определения типов для API Node.js,ts-nodeМожет запускать файлы TypeScript напрямую,nodemonОтслеживает изменения файлов и автоматически выполняет перезапуск.
Конфигурация tsconfig.json
Настройте параметры компилятора TypeScript, оптимизированные для проектов Node.js.
tsconfig.json
"compilerOptions": {
// Цель компиляции: ES2020
"target": "ES2020",
⟦0∥// Система модулей: CommonJS (нативно поддерживается Node.js)
"module": "commonjs",
// Включенные библиотеки
"lib": ["ES2020"],
// Каталог вывода
"outDir": "./dist",
// Корневой каталог исходного кода
"rootDir": "./src",
// Строгий режим (всегда включён)
"strict": true,
// Совместимость с ES-модулями
"esModuleInterop": true,
// Пропустить проверки библиотек
"skipLibCheck": true,
// Обеспечить единообразный регистр в именах файлов
"forceConsistentCasingInFileNames": true,
// Стратегия разрешения модулей
"moduleResolution": "node",
// Генерировать файлы объявлений
"declaration": true
},
// Файлы для компиляции
"include": ["src/**/*"],
// Исключаемые файлы
"exclude": ["node_modules", "dist"]
}
Рекомендуемая конфигурация:Для проектов на Node.js рекомендуется использовать
module: "commonjs", которая является системой модулей, нативно поддерживаемой Node.js.
Определение типов
Определите интерфейсы типов проекта в каталоге types.
src/types/index.ts
export interface User {
id: number; // ID пользователя
name: string; // Имя пользователя
email: string; // Электронная почта
createdAt: Date; // Время создания
}
// Объект передачи данных для создания пользователя
export interface CreateUserDTO {
name: string; // Имя пользователя (обязательно)
email: string; // Электронная почта (обязательно)
password: string; // Пароль (обязательно)
}
// Тип ответа API (обобщённый)
export interface ApiResponse<T> {
success: boolean; // Признак успеха
data?: T; // Данные при успехе
error?: string; // Сообщение об ошибке при сбое
}
Определения типов:Централизуйте определения типов в каталоге types для упрощения сопровождения и повторного использования.
Реализация сервисов
Реализуйте бизнес-логику в каталоге services, используя определённые типы.
src/services/userService.ts
import { User, CreateUserDTO, ApiResponse } from "../types";
// Класс сервиса пользователей
class UserService {
// Список пользователей (хранилище в памяти)
private users: User[] = [];
// Следующий ID пользователя
private nextId = 1;
// Создать пользователя
createUser(dto: CreateUserDTO): ApiResponse<User> {
try {
// Создать объект пользователя
const user: User = {
id: this.nextId++,
name: dto.name,
email: dto.email,
createdAt: new Date()
};
this.users.push(user);
return { success: true, data: user };
} catch (error) {
return { success: false, error: "Не удалось создать пользователя" };
}
}
// Получить одного пользователя
getUser(id: number): ApiResponse<User> {
const user = this.users.find(u => u.id === id);
if (!user) {
return { success: false, error: "Пользователь не найден" };
}
return { success: true, data: user };
}
// Получить всех пользователей
getAllUsers(): ApiResponse<User[]> {
return { success: true, data: this.users };
}
}
// Экспорт синглтона
export default new UserService();
Результат выполнения:
UserService 实例化成功
Слой сервисов:Бизнес-логика централизована в слое сервисов для упрощения тестирования и повторного использования.
Создание маршрутов API
Создайте RESTful API с использованием фреймворка Express.
src/index.ts
import userService from "./services/userService";
// Создать приложение Express
const app = express();
// Разобрать тела JSON-запросов
app.use(express.json());
// Получить всех пользователей
app.get("/api/users", (req: Request, res: Response) => {
const result = userService.getAllUsers();
res.json(result);
});
// Получить одного пользователя
app.get("/api/users/:id", (req: Request, res: Response) => {
const id = parseInt(req.params.id);
const result = userService.getUser(id);
res.json(result);
});
// Создать пользователя
app.post("/api/users", (req: Request, res: Response) => {
const result = userService.createUser(req.body);
res.json(result);
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Сервер запущен по адресу http://localhost:${PORT}`);
});
Результат выполнения:
服务器运行在 http://localhost:3000
Подсказки типов:Используя
RequestиResponseтип, IDE предоставит полные подсказки свойств.
Скрипты package.json
Настройте npm-скрипты, чтобы упростить процесс разработки.
package.json
"scripts": {
// Компиляция TypeScript
"build": "tsc",
// Запуск скомпилированного JavaScript
"start": "node dist/index.js",
// Режим разработки: используйте nodemon для отслеживания изменений и автоматического перезапуска
"dev": "nodemon --exec ts-node src/index.ts",
// Запуск тестов
"test": "jest"
}
}
Эффективность разработки:Использование
npm run devпозволяет автоматически перезапускать сервер после изменений кода.
Примечания
- Строгий режим:Всегда включайте strict: true
- Выбор модуля:Проекты Node.js должны использовать commonjs
- Определения типов:Установите @types/node, чтобы получить типы API
- Инструменты разработки:Используйте ts-node для горячей перезагрузки
Лучшие практики:Храните определения типов отдельно от бизнес-логики для упрощения тестирования и сопровождения.
Итог
TypeScript — отличный выбор для серверной разработки на Node.js.
- Конфигурация проекта:Используйте tsconfig.json для настройки параметров компиляции
- Определения типов:Централизованно управляйте интерфейсами в каталоге types
- Слой сервисов:Отделите бизнес-логику от маршрутов
- Маршруты:Используйте Express для создания RESTful API
- Инструменты разработки:ts-node и nodemon повышают эффективность разработки
Другие расширенияРекомендация:Используйте TypeScript напрямую для новых проектов; существующие проекты можно мигрировать постепенно.