TypeScript Express 类型怎么用
做后端开发时,你是不是常遇到这种糟心事:写接口参数时传了个字符串,结果本该是数字的字段报错,排查半天找不到问题?或者调试时,控制台输出一堆乱七八糟的类型,根本分不清哪块是合法数据?这时候,TypeScript 和 Express 的组合,就能帮你把这些“隐性坑”全填上。
为什么要给 Express 加类型?
先说说为什么要给 Express 套上 TypeScript 的类型约束。普通 JavaScript 写 Express 时,你可能靠文档猜接口参数格式,或者运行时报错才发现问题——比如用户注册接口要求年龄是数字,结果前端传了“25”(字符串),后端要么直接存错数据,要么花半小时查日志找原因。

TypeScript 的核心就是“提前定规矩”:你写代码时就规定好什么参数该是什么类型,不符合的代码根本跑不起来。举个生活化的例子:你开奶茶店,点单时会明确说“要1杯常温的珍珠奶茶”,而不是“来个奶茶”——这个“1杯”“常温”“珍珠”,就是你给订单定的类型约束,能避免给客人上错饮品。
给 Express 核心对象加类型的简单方法
Express 有三个最常用的核心对象:req(请求对象)、res(响应对象)、next(中间件跳转函数),给它们加类型是最基础也最实用的操作。
很多人一开始会觉得要写复杂的类型定义,其实不用,用 Express 官方配套的类型包 @types/express 就能直接用。比如写一个简单的获取用户信息的接口:
`typescript
import express, { Request, Response } from 'express';
const app = express();
// 给 req 和 res 直接套官方定义的类型
app.get('/user', (req: Request, res: Response) => {
// 现在 TypeScript 会自动提示 req.query 里的参数类型
const userId = req.query.id; // 这里会自动提示是 string | undefined
// 如果要转成数字,提前加约束,避免隐式转换
const userIdNum = Number(userId);
if (isNaN(userIdNum)) {
return res.status(400).send('用户ID必须是数字');
}
res.json({ userId: userIdNum, name: '张三' });
});
`
是不是很简单?这里的 Request 和 Response 就是官方定义好的类型,就像奶茶店的“标准订单模板”,你只要往里填内容就行,不用自己画模板。
自定义接口参数类型,解决复杂场景
如果接口参数不是简单的 query,而是 POST 提交的 JSON 数据(比如用户注册的账号、密码、年龄),官方的 Request 可能不够用,这时候就要自定义类型了。
比如注册接口,需要三个参数:username(字符串,必填)、password(字符串,必填,至少6位)、age(数字,可选)。先定义一个符合要求的类型:
`typescript
// 自定义用户注册的参数类型
type RegisterParams = {
username: string;
password: string;
age?: number; // ? 表示可选
};
// 把自定义类型套到 Request 上,告诉 Express 这个接口的 req.body 是什么格式
app.post('/register', (req: Request<{}, {}, RegisterParams>, res: Response) => {
const { username, password, age } = req.body;
// TypeScript 会自动检查:有没有漏传必填项?password 是不是字符串?
if (password.length < 6) {
return res.status(400).send('密码至少6位');
}
res.status(201).send(欢迎 ${username} 注册成功);
});
`
这里的 Request<{}, {}, RegisterParams> 里,第一个泛型参数是路由参数(比如 /user/:id 里的 id),第二个是响应的 JSON 类型,第三个就是请求体的类型——就像你给奶茶店加了“特别要求:密码不能少于6位”,系统会自动帮你检查,不用等客人拿到错的饮品才发现。
常见的小误区提醒
刚用的人容易踩两个坑:一是忘了装 @types/express,直接写 Request 会报错,就像你没拿奶茶店的订单模板,自己瞎写订单肯定没人认;二是自定义类型太松,比如把 password 设成 string | number,结果前端传了123,存到数据库里变成了字符串“123”,还是会出小问题。
其实只要记住:类型是“帮你干活的工具”,不是“束缚你的规矩”——就像奶茶店的订单模板,既能保证不出错,又不会让你觉得麻烦。用 TypeScript + Express 写代码,就能把之前那些“跑起来才知道的坑”,全堵在写代码的阶段,省下来的时间,足够你多喝两杯奶茶了。