我想用prisma和typescript从我的数据库中获取数据,所以我做了这个简单的函数
export async function getAll(model : string) {
const results = await prisma[`${model}`].findMany()
await prisma.$disconnect()
return results }
它工作正常,但我有打字错误Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'PrismaClient<PrismaClientOptions, never, RejectOnNotFound | RejectPerOperation | undefined>'. No index signature with a parameter of type 'string' was found on type 'PrismaClient<PrismaClientOptions, never, RejectOnNotFound | RejectPerOperation | undefined>
我是一个新手与typescript和prisma,我不知道如何解决这个错误
2条答案
按热度按时间wztqucjr1#
我没有使用过prisma,但我知道它应该可以与typescript一起使用,生成像
await prisma.<model>.<query>...
这样的简单查询。所以如果你想在你自己的函数中 Package prisma方法,你必须确保你保留了类型。你提到你是新的prisma和typescript在一起,但我不知道你有多了解他们,所以我会尝试和解释在一个容易理解的方式,使它实际上是有用的。
在本例中,您将输入prisma模型名称作为字符串(
getAll
函数的model
参数)。这意味着,就typescript而言,对prisma函数的任何调用都在寻找string
类型的模型,但是因为prisma已经为您生成了string
类型的模型,所以不满足对模型的查找,因为您没有为每个字符串提供一个模型,这是一个无限数量的模型。换句话说,没有精确性,就像在普通的js中寻找map或object中的某个东西,但你只知道它是一个字符串。因此,您的目标应该是以一种类型精确的方式 Package 方法。使用泛型,您可以确保任何类型的模型名称都保留其确切的类型,在本例中,这些是表示模型名称的字符串文字。这里有一个例子
如果我用这个
str
的类型是hi
。对于您的示例,这将成为
这确保了参数model按照类型传递给
prisma[model]
,所以如果您输入了正确的模型名称,它应该可以工作。如果您还想约束参数,使其本身只接受有效的字符串文字,则可以执行以下操作这确保了传递给
getAll
的任何参数都是有效的模型名称字符串文字,可能不是必需的,但无论如何。或者,您可以直接使用prisma进行查询。
希望这能帮上忙。
tcbh2hod2#
模型类型应该是这样的。如果您有
User
模型,如果您编写prisma.user
,您将为.user
使用此类型取决于您有多少模型类型
你可以写一个自定义类型
而不是
model:String
,您可以传递