TypeScript Prisma 类型怎么用

每天写后端接口时,你是不是也遇过这种糟心事儿:写好的函数要接收用户提交的订单数据,敲代码时明明觉得字段都对,运行后却报错说“某个字段类型不对”,翻半天发现是前端传了个字符串“199”过来,你却当成了数字用;或者想拿数据库里的用户昵称,结果数据库里存的是昵称的拼音缩写,你代码里却写了中文的“昵称”,导致数据拿错?

要是你用的是 TypeScript 加 Prisma 这套组合拳,这些坑基本能绕开——核心就是用好它们自带的类型系统,不用自己瞎写一堆类型声明,还能让代码更稳。今天就用几个生活化的例子,把这套类型用法讲透。

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 的类型,本质上就是给你的数据库和代码加了一套“规则说明书”,既能少写重复代码,又能少踩数据类型的坑,新手也能快速写出稳当的后端代码。

上一篇 C / C++ 编程语言核心特性与应用场景的全面科普解析