跳至主要内容

类型实用程序

Prisma Client 中存在多个类型实用程序,可以帮助创建高度类型安全的扩展。

类型实用程序

Prisma Client 类型实用程序 是在您的应用程序和 Prisma Client 扩展中可用的实用程序,并提供构建安全且可扩展的扩展类型的方法。

可用的类型实用程序包括

  • Exact<Input, Shape>:对 Input 强制执行严格的类型安全。Exact 确保泛型类型 Input 严格符合您在 Shape 中指定的类型。它 缩小 Input 到最精确的类型。
  • Args<Type, Operation>:检索任何给定模型和操作的输入参数。这对于希望执行以下操作的扩展作者特别有用
    • 重用现有类型以扩展或修改它们。
    • 受益于与现有操作相同的自动完成功能。
  • Result<Type, Arguments, Operation>:获取输入参数并提供给定模型和操作的结果。您通常会将其与 Args 结合使用。与 Args 一样,Result 可以帮助您重用现有类型以扩展或修改它们。
  • Payload<Type, Operation>:检索结果的整个结构,作为给定模型和操作的标量和关系对象。例如,您可以使用它在类型级别确定哪些键是标量或对象。

以下示例基于 findFirst 创建了一个新的操作 exists。它具有 findFirst 的所有参数。

const prisma = new PrismaClient().$extends({
model: {
$allModels: {
// Define a new `exists` operation on all models
// T is a generic type that corresponds to the current model
async exists<T>(
// `this` refers to the current type, e.g. `prisma.user` at runtime
this: T,

// The `exists` function will use the `where` arguments from the current model, `T`, and the `findFirst` operation
where: Prisma.Args<T, 'findFirst'>['where']
): Promise<boolean> {
// Retrieve the current model at runtime
const context = Prisma.getExtensionContext(this)

// Prisma Client query that retrieves data based
const result = await (context as any).findFirst({ where })
return result !== null
},
},
},
})

async function main() {
const user = await prisma.user.exists({ name: 'Alice' })
const post = await prisma.post.exists({
OR: [
{ title: { contains: 'Prisma' } },
{ content: { contains: 'Prisma' } },
],
})
}

向方法添加自定义属性

以下示例说明了如何在扩展中向方法添加自定义参数

type CacheStrategy = {
swr: number
ttl: number
}

const prisma = new PrismaClient().$extends({
model: {
$allModels: {
findMany<T, A>(
this: T,
args: Prisma.Exact<
A,
// For the `findMany` method, use the arguments from model `T` and the `findMany` method
// and intersect it with `CacheStrategy` as part of `findMany` arguments
Prisma.Args<T, 'findMany'> & CacheStrategy
>
): Prisma.Result<T, A, 'findMany'> {
// method implementation with the cache strategy
},
},
},
})

async function main() {
await prisma.post.findMany({
cacheStrategy: {
ttl: 360,
swr: 60,
},
})
}

此处的示例仅供概念参考。为了使实际缓存正常工作,您必须实现逻辑。如果您对缓存扩展/服务感兴趣,我们建议您查看 Prisma Accelerate