【问题标题】:Retaining strong typing with an optional parameter使用可选参数保留强类型
【发布时间】:2021-10-30 14:15:16
【问题描述】:

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

目前,我使用预定义的select 字段来确保输入的返回数据完全包含其中的字段。

我被要求添加在调用函数时指定您自己的select 的功能。有没有办法支持这个而不丢失返回数据的类型?

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

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 });
};

在这个 sn-p 中,xy 都有一个联合类型。 x 是:{ name: string; description: string; }[] | {}[]y{ name: string; description: string; }[] | { name: string; }[]

有没有办法让xonly{name: string, description: string}的返回类型和yonly{name: string }的返回类型?我希望缩小 select === undefined 就足够了,但似乎还不够。

【问题讨论】:

    标签: typescript prisma


    【解决方案1】:

    这并不是那么简单:

    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()
      }
    }
    

    这将为您提供所需的内容。

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 2023-01-18
      • 2023-03-17
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2011-09-15
      相关资源
      最近更新 更多