使用可选参数保留强类型
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 });
};
在此代码段中,x
和 y
都具有联合类型。 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()
}
}
这会给你想要的东西。
我将 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 });
};
在此代码段中,x
和 y
都具有联合类型。 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()
}
}
这会给你想要的东西。