TypeScript Prisma 类型怎么用
每天写后端接口时,你是不是也遇过这种糟心事儿:写好的函数要接收用户提交的订单数据,敲代码时明明觉得字段都对,运行后却报错说“某个字段类型不对”,翻半天发现是前端传了个字符串“199”过来,你却当成了数字用;或者想拿数据库里的用户昵称,结果数据库里存的是昵称的拼音缩写,你代码里却写了中文的“昵称”,导致数据拿错?
要是你用的是 TypeScript 加 Prisma 这套组合拳,这些坑基本能绕开——核心就是用好它们自带的类型系统,不用自己瞎写一堆类型声明,还能让代码更稳。今天就用几个生活化的例子,把这套类型用法讲透。

先搞懂:Prisma 和 TypeScript 的类型是咋联动的
Prisma 是用来操作数据库的工具,你只要写一段简单的“数据库结构描述”,它就能自动生成一套符合这个结构的类型。TypeScript 是给 JavaScript 加了类型的语法,相当于给代码装了个“提前查错的预警器”。
举个生活化的例子:你要开一家奶茶店,先写了一份“菜单标准”(就是 Prisma 的 schema 文件):饮品有“冰美式”(id、名称、价格),配料有“糖度”“冰块量”。Prisma 就会根据这份菜单,自动生成一套“饮品的标准类型”,TypeScript 拿着这套类型,就知道你代码里的饮品应该有啥字段、每个字段是啥样的,比如“价格”就得是数字,不能是“二十块”这种字符串。
第一步:用 Prisma 自动生成基础类型,不用自己瞎写
刚开始用 Prisma,不用费脑子写类型,它帮你搞定大部分基础类型。比如你在 Prisma 的 schema 里写了:
`prisma
model Order {
id Int @id @default(autoincrement())
userId String
amount Int
status String @default("待付款")
createdAt DateTime @default(now())
}
`
你运行 prisma generate 后,Prisma 会自动生成一个 Order 类型,这个类型里的字段、类型全和你写的 schema 一致。你在 TypeScript 里只要导入这个类型,就能直接用:
`typescript
import { Prisma } from '@prisma/client';
// 这就是自动生成的订单类型,不用自己写
const newOrder: Prisma.OrderCreateInput = {
userId: "user_123",
amount: 28,
// 这里status你不写,Prisma会自动用默认值“待付款”,类型也会帮你校验
};
`
要是你不小心把 amount 写成了字符串“28”,TypeScript 会直接给你标红,连运行都不用,提前就把错误拦住了,这不比你写完代码测半天强?
第二步:按需选类型,避免拿多或拿少字段
有时候你不需要订单的所有字段,比如只需要查订单的 id 和 status,这时候 Prisma 也有对应的工具,不用把所有字段都列出来。比如用 Prisma 提供的 Pick 类型:
`typescript
import { Prisma } from '@prisma/client';
// 从Order类型里只挑id和status两个字段
type OrderStatus = Prisma.OrderGetPayload<{
select: { id: true, status: true }
}>;
// 这个类型就只有id和status,不会有多余的amount、createdAt
const orderStatus: OrderStatus = {
id: 1,
status: "待发货",
// 要是你加个多余的amount,TypeScript会直接报错
};
`
就像你去奶茶店点单,只说要“冰美式”,不用跟店员说要杯子、吸管、糖度,店员只会给你你要的那杯,不会多给,代码也是这个道理,只拿需要的字段,减少出错的可能。
第三步:自定义特殊场景的类型,灵活调整
有时候 schema 里的默认类型满足不了需求,比如你想把 status 限制成只能是“待付款”“已付款”“已取消”这三个值,不能随便写别的,这时候就可以结合 TypeScript 的联合类型,在 Prisma 类型的基础上改:
`typescript
import { Prisma } from '@prisma/client';
// 先拿到Prisma生成的Order类型里的status字段类型,再改成联合类型
type OrderStatus = Prisma.Order['status'];
// 限制status只能是这三个值,避免乱传
type CustomOrderStatus = "待付款" | "已付款" | "已取消";
// 类型校验会帮你拦住“已发货”这种非法值
const checkStatus: CustomOrderStatus = "已付款"; // 正确
const wrongStatus: CustomOrderStatus = "已发货"; // 报错
`
就像奶茶店的糖度只能选“三分糖”“五分糖”“全糖”,不能选“一万糖”,这种自定义范围的类型,能帮你把数据的边界卡得更死。
最后再提个小提醒:每次改了 Prisma 的 schema,一定要记得跑 prisma generate,不然后面的类型都是旧的,白用了这套工具的优势。用 TypeScript + Prisma 的类型,本质上就是给你的数据库和代码加了一套“规则说明书”,既能少写重复代码,又能少踩数据类型的坑,新手也能快速写出稳当的后端代码。