typescript 使用型号名称显示Prisma型号

a64a0gku  于 2023-06-24  发布在  TypeScript
关注(0)|答案(3)|浏览(135)

我需要创建一个函数,该函数使用模型的名称作为参数来显示Prisma模型。每次模型名称可以更改,TypeScript应该自动检查Prisma模型是否存在。

/* 
file schema.prisma models:

model User {
  id          Int      @id @default(autoincrement())
  name        String
  password    String
  job         String   @default("")
  location    String   @default("")
  phone       String   @default("")
  email       String
}

model Participant {
  id         Int       @id @default(autoincrement())
  userID     Int
  groupID    Int
}

*/

import { PrismaClient } from "@prisma/client";

function loadModel(modelName: /* string */) {
  const prisma = new PrismaClient();
  const Model = prisma[modelName]
}

loadModel("user")

以下代码将返回错误:
元素隐式地具有“any”类型,因为“string”类型的表达式不能用于索引类型“PrismaClient<PrismaClientOptions,永远不能,RejectOnNotFound| RejectPerOperation| undefined>'。在类型“PrismaClient<PrismaClientOptions,never,RejectOnNotFound”上未找到参数类型为“string”的索引签名|RejectPerOperation| undefined>'。
在这个错误之后,我试图添加到modelName参数: keyof PrismaClient它的工作,但当我尝试添加类似Model.create({...})-它返回以下错误:
属性'create'不存在于类型'(<V extends“beforeExit”>(eventType:五、回调:(event:V extends“query”?查询事件:V扩展“beforeExit”?()=> Promise:LogEvent)=> void)=> void)|……还有十一个……|MessageDelegate<...>'。属性'create'在类型'<V extends“beforeExit”>上不存在(eventType:五、回调:(event:V extends“query”?查询事件:V扩展“beforeExit”?()=> Promise:LogEvent)=> void)=> void '。
如何解决此问题?

h43kikqp

h43kikqp1#

您可以使用从@prisma/client和ts-transformer-keys库导入的类型。

import { keys } from 'ts-transformer-keys';
import { User } from '@prisma/client'

const keysOfUser = keys<User>();

console.log(keysOfProps); // ['id', 'name', 'password', ...]
hs1ihplo

hs1ihplo2#

如果您想在Prisma中添加一个开放的功能请求,请在此请求中原生支持:https://github.com/prisma/prisma/issues/5273

r1zhe5dt

r1zhe5dt3#

您会得到错误,因为modelName可以是任何字符串,而它只能接收“user”或“participant”(根据schema.prisma模型)。
因此,要获取您的型号列表,您可以使用Prisma类型获取

/* 
file schema.prisma models:

model User {
  id          Int      @id @default(autoincrement())
  name        String
  password    String
  job         String   @default("")
  location    String   @default("")
  phone       String   @default("")
  email       String
}

model Participant {
  id         Int       @id @default(autoincrement())
  userID     Int
  groupID    Int
}

*/

import { Prisma, PrismaClient } from "@prisma/client";

type PrismaOption = PrismaClient<
  Prisma.PrismaClientOptions,
  never,
  Prisma.RejectOnNotFound | Prisma.RejectPerOperation | undefined
>

// this will return "user" | "participant"
export type PrismaModel = keyof Omit<
  PrismaOption,
  | "$connect"
  | "$disconnect"
  | "$executeRaw"
  | "$executeRawUnsafe"
  | "$on"
  | "$queryRaw"
  | "$queryRawUnsafe"
  | "$transaction"
  | "$use"
>

function loadModel(modelName: PrismaModel) { // modelName type will be "user" | "participant"
  const prisma = new PrismaClient();
  return prisma[modelName]
}

loadModel("user")

相关问题