并行使用 prisma 和 typescript 模型

Posted

技术标签:

【中文标题】并行使用 prisma 和 typescript 模型【英文标题】:Using prisma and typescript models in parallel 【发布时间】:2021-10-01 20:36:09 【问题描述】:

我经常在我的打字稿模型中使用const assertions:

const ListingVehicleTypes = [
  "car",
  "motorcycle",
  "caravan",
  "camper_trailer"
] as const;

interface LISTING 
  vehicleType: typeof ListingVehicleTypes[number];
  ...

因此,LISTING["vehicleType"] 被正确推断为"car" | "motorcycle" | "caravan" | "camper_trailer"

我可以在我的 schema.prisma 中表达这些限制吗?*.prisma 文件中既不允许导入也不允许 typescript 实用程序:

model Listing 
    vehicleType   typeof ListingVehicleTypes[number]  // no-go

如果没有,当执行 prisma 驱动的数据库查询时,有没有办法用类型更安全的 typescript 模型“丰富”prisma 模型?

我总是可以将查询正文和响应转换为any,但有没有更简洁的方法?

对于它的价值,我使用的是mongodb provider——但我不认为提供者在这里发挥作用。

【问题讨论】:

【参考方案1】:

我建议为此使用enum。但请务必检查 here 的底层数据库是否支持枚举。

在 Prisma 架构中,


model Listing 
  vehicleType  VehicleType @default(car)


enum VehicleType 
  car
  motorcycle
  caravan
  camper_trailer


然后在您的打字稿代码中,您可以按如下方式使用它。

import  Listing  from "@prisma/client";

type VehicleTypes = Listing["vehicleType"];

【讨论】:

这是朝着正确方向迈出的一步,谢谢!但是,type VehicleTypes 就是这样——type。而且我使用 const 断言在我的类型声明之外保留数组的可迭代质量(尤其是在生成前端或通过yup 模式进行验证时)。换句话说,我不能迭代 prisma 生成的类型——Object.keys(Listing['vehicleType']) 当然会抛出 'Listing' only refers to a type, but is being used as a value here. 我想这就是 prisma 和 ts 模型之间的联系结束的地方。 如果您需要从类型 ts-transformer-keys 获取可迭代数组可能会有所帮助。不过我没用过,所以不知道有什么限制。

以上是关于并行使用 prisma 和 typescript 模型的主要内容,如果未能解决你的问题,请参考以下文章

创建记录时 Prisma typescript 类型错误

用于解析器 GraphQL 瑜伽的 TypeScript 类型(在上下文中使用 prisma2)

TypeGraphql 和 Prisma 2 类型冲突

问:使用 context.prisma 时的智能感知

在生产问题中部署 Typescript GraphQL

如何使用 typegraphql-prisma 保护用户数据