使用 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);
当您添加多个复杂的包含时,它会变得非常混乱。我是否遗漏了一些关于如何限制前端这些类型的明显内容?
干杯!
您不会返回用户。您正在返回用户的子集。
因此您可以制作与自己匹配的类型:
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);