我正在尝试使用更通用的方法从 prisma 获取数据,我的函数目前如下所示:
import { Prisma, PrismaClient } from '@prisma/client';
import { NextApiRequest, NextApiResponse } from 'next';
const prisma = new PrismaClient();
const getAllOfResource = async (resourceName: Prisma.ModelName) => {
const resource = prisma[resourceName as Prisma.ModelName];
if (!resource.findMany) throw Error('Error: findMany not found, does resource exist?');
return await resource.findMany();
};
const validateResourceTypeExists = (resourceType: unknown): resourceType is Prisma.ModelName => {
return typeof resourceType === 'string' && Object.keys(Prisma.ModelName).includes(resourceType);
};
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const requestedResource = req.query.id;
if (!validateResourceTypeExists(requestedResource)) {
res.status(500).json({
message: 'Please use a valid resource type',
});
} else {
const resource = await getAllOfResource(requestedResource);
return res.status(200).json(resource);
}
}
但是,当在资源上调用
findMany()
时,它给了我一个错误:
This expression is not callable.
Each member of the union type '(<T extends mediaFindManyArgs<DefaultArgs>>(args?: SelectSubset<T, mediaFindManyArgs<DefaultArgs>> | undefined) => PrismaPromise<...>) | (<T extends booksFindManyArgs<...>>(args?: SelectSubset<...> | undefined) => PrismaPromise<...>)' has signatures, but none of those signatures are compatible with each other
我不知道为什么这不行,因为
Prisma.ModelName
中的所有内容都应该有 findMany
方法。我是否错过了更好的类型,或者我的做法是否存在根本性错误?
我已经尝试了一些方法,但我认为这很可能是我不理解它是如何工作的。
TypeScript 无法保证资源在所有情况下都包含“findMany”方法,因此会发生此异常。 为了防止这种情况,您可以预设资源类型:
const resource: Prisma.PrismaClient['resourceName'] = prisma[resourceName as Prisma.ModelName];