TypeScript Express 类型怎么用

做后端开发时,你是不是常遇到这种糟心事:写接口参数时传了个字符串,结果本该是数字的字段报错,排查半天找不到问题?或者调试时,控制台输出一堆乱七八糟的类型,根本分不清哪块是合法数据?这时候,TypeScript 和 Express 的组合,就能帮你把这些“隐性坑”全填上。

为什么要给 Express 加类型?

先说说为什么要给 Express 套上 TypeScript 的类型约束。普通 JavaScript 写 Express 时,你可能靠文档猜接口参数格式,或者运行时报错才发现问题——比如用户注册接口要求年龄是数字,结果前端传了“25”(字符串),后端要么直接存错数据,要么花半小时查日志找原因。

TypeScript Express 类型怎么用

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 写代码,就能把之前那些“跑起来才知道的坑”,全堵在写代码的阶段,省下来的时间,足够你多喝两杯奶茶了。

上一篇 JavaScript 变量提升是什么