如何修复在使用Prisma和TypeScript时“Element隐式地具有“any”type”错误?

avwztpqn  于 2023-06-07  发布在  TypeScript
关注(0)|答案(2)|浏览(299)

我想用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,我不知道如何解决这个错误

wztqucjr

wztqucjr1#

我没有使用过prisma,但我知道它应该可以与typescript一起使用,生成像await prisma.<model>.<query>...这样的简单查询。
所以如果你想在你自己的函数中 Package prisma方法,你必须确保你保留了类型。你提到你是新的prisma和typescript在一起,但我不知道你有多了解他们,所以我会尝试和解释在一个容易理解的方式,使它实际上是有用的。
在本例中,您将输入prisma模型名称作为字符串(getAll函数的model参数)。这意味着,就typescript而言,对prisma函数的任何调用都在寻找string类型的模型,但是因为prisma已经为您生成了string类型的模型,所以不满足对模型的查找,因为您没有为每个字符串提供一个模型,这是一个无限数量的模型。换句话说,没有精确性,就像在普通的js中寻找map或object中的某个东西,但你只知道它是一个字符串。
因此,您的目标应该是以一种类型精确的方式 Package 方法。使用泛型,您可以确保任何类型的模型名称都保留其确切的类型,在本例中,这些是表示模型名称的字符串文字。这里有一个例子

const createString = <T extends string>(str:T)=>str;

如果我用这个

const str = createString('hi');

str的类型是hi
对于您的示例,这将成为

export async function getAll <T extends string>(model: T) {
  const results = await prisma[`${model}`].findMany();
  await prisma.$disconnect();
  return results;
}

这确保了参数model按照类型传递给prisma[model],所以如果您输入了正确的模型名称,它应该可以工作。如果您还想约束参数,使其本身只接受有效的字符串文字,则可以执行以下操作

type MyPrisma = typeof prisma
export async function getAll <T extends keyof MyPrisma>(model: T) {
  const results = await prisma[`${model}`].findMany();
  await prisma.$disconnect();
  return results;
}

这确保了传递给getAll的任何参数都是有效的模型名称字符串文字,可能不是必需的,但无论如何。
或者,您可以直接使用prisma进行查询。
希望这能帮上忙。

tcbh2hod

tcbh2hod2#

模型类型应该是这样的。如果您有User模型,如果您编写prisma.user,您将为.user使用此类型

Prisma.UserDelegate<Prisma.RejectOnNotFound | Prisma.RejectPerOperation | undefined>

取决于您有多少模型类型
你可以写一个自定义类型

type PrismaModel=
    Prisma.UserDelegate<Prisma.RejectOnNotFound | Prisma.RejectPerOperation | undefined> |
    Prisma.AnotherModelDelegate<Prisma.RejectOnNotFound | Prisma.RejectPerOperation | undefined> | ..soon

而不是model:String,您可以传递

model:PrismaModel

相关问题