Typescript 转换对象<;T>;反对<;A>;其中A包含在T中

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自动生成):

但是,当我的客户端请求这些数据时,我无法在响应负载中发送敏感信息

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-like
User类型的对象强制转换为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;
}