Prisma/Typescript:如何扩展客户端



我实现了这样的类:

import { PrismaClient } from '@prisma/client';
export type NotStartsWith<
S,
Prefix extends string,
> = S extends `${Prefix}${infer _X}` ? never : S;
export class DatabaseService extends PrismaClient {
async $findPaginated<
M extends NotStartsWith<keyof DatabaseService, '$'>,
A extends Parameters<DatabaseService[M]['findMany']>[0],
>(model: M, args?: A) {
const data = await this[model].findMany(args);
return {
page: 1,
results: data,
total: 1,
totalPages: 1,
};
}
}

让我们假设我有模型postuser

真正的实施并不重要。但是typescript在findMany调用中给了我这个错误:

This expression is not callable. Each member of the union type 'x | y | z' has signatures, but none of those signatures are compatible with each other.

我想这意味着我可以用post的自变量调用userfindMany。但这是不可能的,因为它都是打字好的。如果我改为(this[model] as any)来编译并键入带有第一个参数post的新函数,那么对于模型post,第二个参数的属性将正确地自动完成。

所以我不明白为什么我不能完全键入我的函数。

此外,这不是Prisma的最佳扩展。理想情况下,我想为所有模型都使用的非常的通用接口(findMany、findUnique等(添加打字员,然后在运行时将我的函数添加到所有模型。但Prisma并不是这样生成类型的。

我想你想在自定义模型中添加prisma客户端的方法。

自定义型号:

class Users {
constructor(private readonly prismaUser: PrismaClient['user']) {}
//Signup a new user
async signup(data: Signup): Promise<User> {
// do some custom validation...
return this. prismaUser. create({ data })
}
}

自定义模型文档:https://www.prisma.io/docs/concepts/components/prisma-client/custom-models

最新更新