Typescript 转换对象<;T>;反对<;A>;其中A包含在T中
我正在与Prisma合作,为我的数据库数据生成模式和模型。Typescript 转换对象<;T>;反对<;A>;其中A包含在T中,typescript,casting,type-conversion,prisma,prisma2,Typescript,Casting,Type Conversion,Prisma,Prisma2,我正在与Prisma合作,为我的数据库数据生成模式和模型。 在这里,我定义了一个“用户”模型,其中包含以下数据(类型由Prisma自动生成): 但是,当我的客户端请求这些数据时,我无法在响应负载中发送敏感信息 Prisma有一种非常方便的定义自定义类型的方法: import { UserGetPayload } from "./prisma/src/generated/client" // now I define a custom type export type Use
在这里,我定义了一个“用户”模型,其中包含以下数据(类型由Prisma自动生成): 但是,当我的客户端请求这些数据时,我无法在响应负载中发送敏感信息 Prisma有一种非常方便的定义自定义类型的方法:
import { UserGetPayload } from "./prisma/src/generated/client"
// now I define a custom type
export type UserPublicInfo = UserGetPayload<{
select: {
name: true,
nickName: true,
}
}>
// this gives me the type:
// type UserPublicInfo {
// name: <whatever type name is in the schema>,
// nickName: <whatever type nickName is in the schema>
// }
从“/prisma/src/generated/client”导入{UserGetPayload}
//现在我定义了一个自定义类型
导出类型UserPublicInfo=UserGetPayload
//这给了我类型:
//输入UserPublicInfo{
//姓名:,
//昵称:
// }
现在,假设我已经从数据库中检索到一个user类型的用户实例。我不想将其转换为“UserPublicInfo”,因为响应负载只包含“UserPublicInfo”的信息
如果我将User-likeUser类型的对象强制转换为UserPublicInfo
类型建议指向正确的方向,只显示子类型的属性。然而,敏感数据仍然存在
我是javascipt/typescript的大三学生,但我相信这与对象的原型有关。那么我怎样才能这样转换呢?这个问题有两个部分,如何告诉typescript属性消失了,以及如何实际删除它们 Typescript 您正在寻找的是typescript实用程序和 要仅从
用户
获取名称
和昵称
字段,请执行以下操作:
type UserPublicInfo = Pick<User, 'name' | 'nickName'>
在您给出的示例中,这两种类型是相同的,解析为
type UserPublicInfo = {
name: string;
nickName: string;
}
Javascript
现在开始删除属性。最简单的方法是使用包中的pick
和ommit
函数。它们具有内置的typescript支持,所以您不需要知道我刚才告诉您的任何TS内容
如果您想自己做,可以使用spread操作符删除您不想要的属性(注意:一些linter会在这里抱怨未使用的变量)
你的答案很完美!非常感谢。我有没有办法让lodash或typescript自己选择子类型定义的所有元素?比如uu.pick(User,UserPublicInfo)。这比显式拾取子类型定义的属性要好得多。顺便说一句,您的示例的最后一行在TS Playerd链接中有点中断,您也注意到了吗?
type UserWithoutPrivate = Omit<User, 'sensitiveInfo1' | 'sensitiveInfo2'>
type UserPublicInfo = {
name: string;
nickName: string;
}
export const userToPublic = (user: User): UserPublicInfo => {
const {sensitiveInfo1, sensitiveInfo2, ...rest} = user;
return user;
}