使用可选参数保留强类型

Retaining strong typing with an optional parameter

我将 prisma 用于我所有的数据库逻辑,并且我已经开始依赖它从下游数据库中获取的数据的类型。

目前,我正在使用预定义的 select 字段来确保输入的 return 数据准确包含其中的字段。

有人要求我添加在调用函数时指定您自己的 select 的功能。有没有办法在不丢失 returned 数据的输入的情况下支持这个

这是我迄今为止一直在做的事情:

const listAllTypes = <T extends Prisma.UserTypeSelect>(select?: T) => {
  return select === undefined
    ? prisma.userType.findMany({ select: { name: true, description: true } })
    : prisma.userType.findMany({ select });
};

const test = async () => {
  const x = await listAllTypes();
  const y = await listAllTypes({ name: true });
};

在此代码段中,xy 都具有联合类型。 x 是:{ name: string; description: string; }[] | {}[] 并且 y{ name: string; description: string; }[] | { name: string; }[]

有没有办法让return类型的x只有{name: string, description: string}和return类型的y 只有 {name: string }?我希望缩小 select === undefined 就足够了,但似乎不够。

虽然不是那么简单:

model User {
  id    String @id @default(uuid())
  email String @unique
}

你可以创建这样的东西:

function listAllTypes<S extends Prisma.UserSelect>(
  select?: Prisma.Subset<S, Prisma.UserSelect>
) {
  if (select) {
    return prisma.user.findMany<
      { select: S } & Omit<Prisma.UserFindManyArgs, 'select' | 'include'>
    >({ select })
  } else {
    return prisma.user.findMany()
  }
}

这会给你想要的东西。