使用 select 不返回整个对象时的 Prisma Typescript 打字

问题描述 投票:0回答:1

使用 Prisma 的好处是类型安全应用起来非常简单。

让我们举个例子,我有一个如下的用户模型:

model User {
    id                String      @id @default(cuid())
    name              String
    email             String?     @unique
    emailVerified     DateTime?
    image             String?
}

当我现在查询它并将其置于如下状态时:

import { type User } from "@prisma/client";
const [user, setUser] = useState<User | null>(null);
return await prisma.user.findUnique({
   where: {
      id: userId,
   }
});

然后打字就完全没问题了。现在的问题是:

如果我不希望人们能够查询用户提供的所有信息,我会通过设置这样的选择来限制返回:

return await prisma.user.findUnique({
   where: {
      id: userId,
   },
   select: {
      id: true,
      name: true,
   }
});

现在的问题。 Typescript 现在将返回对象更改为超级无聊的东西,例如

{
   id: string,
   name: string,
}

那么我需要将状态更改为:

import { type User } from "@prisma/client";
const [user, setUser] = useState<{
   id: string,
   name: string,
}| null>(null);

当您添加多个复杂的包含时,它会变得非常混乱。我是否遗漏了一些关于如何限制前端这些类型的明显内容?

干杯!

typescript prisma typing
1个回答
0
投票

您不会返回用户。您正在返回用户的子集。

因此您可以制作与自己匹配的类型:

Pick<User, 'name' | 'id'>

或者:

Omit<User, 'emailVerfied' | 'image' | 'passwordHash'>

如果你经常使用它,你可以创建自己的类型来导入到任何你想要的地方:

// somefile.ts
import { type User } from "@prisma/client";
export type PublicUser = Pick<User, 'name' | 'id'>


// my-component.tsx
import { type PublicUser } from './somefile'

const [user, setUser] = useState<PublicUser | null>(null);
© www.soinside.com 2019 - 2024. All rights reserved.