类型工具
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。