如何解决将Object <T>转换为Object <A>,其中A包含在T中
我正在与Prisma一起为我的数据库数据生成模式和模型。
在那里,我定义了一个“用户”模型,该模型具有此数据(类型由Prisma自动生成):
type User {
name: string,nickName: string,sensitiveInfo1: string,sensitiveInfo2: string
}
但是,当我的客户端请求此数据时,我无法在响应有效负载中发送敏感信息。
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>
// }
现在,假设我已经从数据库中检索到一个用户类型为User的用户实例。我不会以响应有效负载仅包含“ UserPublicInfo”信息的方式将其强制转换为“ UserPublicInfo”。
如果我投射类型为User的user as UserPublicInfo
之类的对象,则类型建议指向正确的方向,仅显示子类型的属性。但是,敏感数据仍然存在。
我是javascipt / typescript的初中生,但我相信这与Object的原型有关。那么我该如何投射呢?
解决方法
这个问题有两部分,如何告诉打字稿属性消失了,以及如何实际删除它们。
打字稿
仅从class NavigationBarScreen extends HookWidget {
@override
Widget build(BuildContext context) {
final pageModel = useProvider(provider.state);
Widget body;
switch (pageModel.page) {
case NavigationBarEvent.HOME:
body = Home();
break;
case NavigationBarEvent.PROFIL:
body: Profile();
break;
}
return Scaffold(
body: body,bottomBar: ...
);
}
}
中获取字段name
和nickName
:
User
要从type UserPublicInfo = Pick<User,'name' | 'nickName'>
获取除User
和sensitiveInfo1
以外的所有字段:
sensitiveInfo2
在您给出的示例中,这两种类型都是相同的,并且解析为
type UserWithoutPrivate = Omit<User,'sensitiveInfo1' | 'sensitiveInfo2'>
JavaScript
现在用于删除属性。最简单的方法是使用软件包lodash中的type UserPublicInfo = {
name: string;
nickName: string;
}
和pick
函数。它们具有内置的打字稿支持,因此您无需了解我刚刚告诉您的任何TS知识。
如果您想自己做,则可以使用传播运算符删除不需要的属性(注意:某些短毛绒在这里会抱怨未使用的变量)。
omit
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。