引言:为什么选择 TypeScript 构建 REST API?
现代 Web 开发离不开清晰且可扩展的 API。TypeScript 作为 JavaScript 的严格类型化超集,能够以最少的运行时错误创建可靠的 REST API。本文将逐步指导您使用流行的 Express 框架,用 TypeScript 创建一个完整的 REST API。整个过程不超过 30 分钟,结果可直接用于实际项目。
我们将涵盖:项目初始化、TypeScript 配置、创建路由、中间件使用、错误处理以及端点测试。所有代码示例均可立即运行并适用于您的任务。
第一步:项目初始化与依赖安装
首先,为项目创建一个新目录并初始化。打开终端并运行:
mkdir my-ts-apicd my-ts-apinpm init -y现在安装必要的包:
npm install expressnpm install -D typescript @types/node @types/express ts-node nodemon创建 TypeScript 配置文件:
npx tsc --init编辑 tsconfig.json 以包含以下选项:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true }}在 package.json 中添加脚本:
"scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "nodemon --exec ts-node src/index.ts"}第二步:创建基本结构与第一个端点
创建一个 src 文件夹,并在其中创建文件 index.ts。我们从响应 GET 请求的简单服务器开始:
import express, { Request, Response } from 'express';
const app = express();const PORT = process.env.PORT || 3000;
// 用于解析 JSON 的中间件app.use(express.json());
// 基本路由app.get('/', (req: Request, res: Response) => { res.send('REST API in TypeScript is working!');});
app.listen(PORT, () => { console.log(`Server running at http://localhost:${PORT}`);});使用命令 npm run dev 启动服务器,并打开 http://localhost:3000。您将看到一条欢迎消息。
创建数据模型
对于完整的 API,我们需要一个实体。让我们创建一个简单的用户模型:
// src/models/user.tsexport interface User { id: number; name: string; email: string; age: number;}
export type CreateUserDto = Omit; 第三步:实现 CRUD 操作
现在创建一个控制器和用于操作用户的路由。创建文件 src/routes/users.ts:
import { Router, Request, Response } from 'express';import { User, CreateUserDto } from '../models/user';
const router = Router();let users: User[] = [ { id: 1, name: 'Ivan', email: 'ivan@example.com', age: 28 }, { id: 2, name: 'Maria', email: 'maria@example.com', age: 32 }];let nextId = 3;
// GET /users - 获取所有用户router.get('/', (req: Request, res: Response) => { res.json(users);});
// GET /users/:id - 根据 ID 获取用户router.get('/:id', (req: Request, res: Response) => { const id = parseInt(req.params.id); const user = users.find(u => u.id === id); if (!user) { return res.status(404).json({ message: 'User not found' }); } res.json(user);});
// POST /users - 创建新用户router.post('/', (req: Request, res: Response) => { const { name, email, age }: CreateUserDto = req.body; if (!name || !email || !age) { return res.status(400).js