所以我遇到了一个我认为常见的困境。我有一个数据库对象,一个来自文档数据库的常规 JS 对象,然后我想将该对象发送到我的客户端。但有些字段是敏感字段,不能透露给客户。
在 C# 世界中,我只需使用声明性反射编程将属性附加到我的 C# 对象,指示哪些字段对于客户端使用是安全的,如下所示:
[SafeForClient]
string MyProperty { get; set; } // send to client.
string SecretData { get; set; } // Do NOT send to client.
然后,我将使用反射来收集所有 [SafeForClient]
属性,构建 JSON,并将其发送到网络。
但在 JavaScript 世界中就没有这样的运气了。这个级别上没有声明性元编程。
我在 TypeScript 中定义了这样的类型:
export type RoomForClient = {
id: number;
name: string;
description: string;
exits: {[index in Direction]?: Exit }
}
export type Room = RoomForClient & {
hiddenFlags: ScriptData;
}
发送给客户端的所有房间数据只是整个房间数据的子集。目前,我有一个不应该包含的属性,这还不错......我可以轻松地从对象中删除该属性。但将来,当添加更多内容时......我将需要在两个地方添加这些属性名称;一次在 Room
定义中,一次在实际削减它的方法中。
如果我有一个“Room”对象,而不手动指定我应该或不应该复制的所有字段,如何创建“RoomForClient”对象?所有这些类型信息都会在运行时被删除,所以说实话,我想不出一种在不违反 DRY 原则的情况下做到这一点的方法。我认为这是一种代码味道。
有什么想法吗?
最佳答案
您可以考虑使用属性或访问器 Decorators .
这样您就可以像下面这样标记您的属性:
export type RoomForClient = {
@SafeForClient
id: number;
...
}
注意:这将需要 Reflect-metadata 库。
关于javascript - 削减 JSON 对象以声明方式发送到 Typescript 中的客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46375551/