typescript 与 express 结合的核心是让请求、响应、中间件、路由处理器和数据模型全程具备可推断、可校验的类型。需正确安装依赖(如 @types/express)、配置 tsconfig.json、定义接口与 dto、显式标注路由处理器泛型参数、扩展 express.request 类型以支持挂载字段,并统一使用 errorrequesthandler 处理错误,确保类型贯穿全链路。

TypeScript 和 Express 在 Node.js 后端中结合,核心是让请求、响应、中间件、路由处理器和数据模型全部具备可推断、可校验的类型,而不是靠运行时手动检查。关键不在于“能不能用”,而在于“怎么让类型真正贯穿每一层”。
初始化项目与基础类型支持
先装对依赖,再配对配置,这是类型安全的前提:
- 运行
npm init -y创建项目,然后安装运行时依赖:npm install express - 安装开发依赖:
npm install -D typescript ts-node @types/node @types/express nodemon—— 其中@types/express提供了Request、Response、NextFunction等核心类型的定义 - 执行
npx tsc --init生成tsconfig.json,重点开启:"target": "ES2020"、"module": "CommonJS"、"strict": true、"esModuleInterop": true、"rootDir": "./src"、"outDir": "./dist"
定义接口类型与 DTO
把 API 的输入输出结构显式声明出来,避免 any 或隐式 any:
- 在
types/user.ts中定义业务实体:interface User { id: number; name: string; email: string; createdAt: Date; } - 用工具类型约束请求体:
type CreateUserBody = Omit<user>;</user>type UpdateUserBody = Partial<pick>>;</pick> - 用
class-validator配合装饰器做运行时验证(需搭配中间件):class CreateUserDTO { @IsString() name: string; @IsEmail() email: string; }
编写类型安全的路由处理器
Express 的 req 和 res 默认是泛型类,必须显式传入类型参数才能启用完整类型检查:
- 路由参数、查询字符串、请求体、响应体各自独立标注:
app.post('/users', (req: Request, res: Response) => { ... }) - 这样写后,
req.body.name就有自动补全和类型保护,res.json({ data: xxx })也会校验xxx是否满足User结构 - 控制器函数可抽离并导出,类型随函数签名一起被推导:
export const createUser = (req: Request, res: Response) => { ... };
类型化中间件与错误处理
中间件也应明确其对 req 的修改,并兼容后续处理器的类型预期:
- 例如日志中间件不改变类型,直接使用原
Request和Response - 若中间件往
req上挂载字段(如用户信息),应扩展Request类型:declare global { namespace Express { interface Request { user?: User; } } } - 统一错误处理中间件接收
ErrorRequestHandler类型,确保err参数被识别为Error实例
整个链路从 package.json 脚本(如 "dev": "nodemon --exec ts-node src/app.ts")到控制器返回值,类型都可追踪、可约束、可重构。不是加了 TypeScript 就自动类型安全,而是每一步主动声明或适配类型,才能真正把错误挡在编译阶段。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











