javascript - 削减 JSON 对象以声明方式发送到 Typescript 中的客户端?

标签 javascript json typescript dry

所以我遇到了一个我认为常见的困境。我有一个数据库对象,一个来自文档数据库的常规 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/

相关文章:

javascript - 如何打印出对象的所有属性

json - 从 pandas 数据框输出的自定义 JSON 格式

javascript - 从 typescript 使用 Facebook SDK

javascript - Angular2 表单页面重新加载?

javascript - FromEvent Keyup 过滤器未按预期工作

javascript - 如何在两个文本框中进行验证

javascript - 如何在 jQuery/JavaScript Bootstrap 中插入 PHP 变量?

javascript - webpack构建后访问全局变量

r - 将 JSON 转换为数据帧/CSV 时需要导航列表方面的帮助

javascript - 从 JSON 文件解析 HTML 时 ngResource 不起作用