2017-09-23 11 views
0

私は共通のジレンマと考えているものを持っています。私はデータベースオブジェクトを持っています。通常のJSオブジェクトはドキュメントデータベースから来て、そのオブジェクトをクライアントに送りたいと思っています。しかし、いくつかのフィールドは機密性が高く、クライアントに明らかにしてはいけません。 C#の世界ではJSONオブジェクトをパースダウンして、Typescriptでクライアントに宣言的に送信しますか?

、私はクライアントの消費のために安全であるフィールドを示し、私のC#のオブジェクトに属性を添付する宣言型反射型プログラミングを使用することになり、このような何か:

[SafeForClient] 
string MyProperty { get; set; } // send to client. 

string SecretData { get; set; } // Do NOT send to client. 

その後、私はリフレクションを使用したいです[SafeForClient]プロパティをすべて収集し、JSONを構築してワイヤに送信します。

JavaScriptの世界でこのような運はありません。このレベルには宣言的なメタプログラミングはありません。

私はこのような活字体で定義された私のタイプがあります。

export type RoomForClient = { 
    id: number; 
    name: string; 
    description: string; 
    exits: {[index in Direction]?: Exit } 
} 

export type Room = RoomForClient & { 
    hiddenFlags: ScriptData; 
} 

をクライアントにそれを作る部屋データのすべてが、全室データのサブセットだけです。現在、私は含まれてはならないプロパティを1つ持っていますが、これは悪くありません。オブジェクトからその属性を簡単に削除することは簡単です。しかし、将来的には、より多くのものが追加されます...私は2つの場所にそれらのプロパティ名を追加する必要があります。 Roomの定義で1回、そして実際にそれを減らすための方法で1回です。

"Room"オブジェクトを持っていて、コピーする必要があるかどうかを手動で指定しなくても、 "RoomForClient"オブジェクトを作成するにはどうすればいいですか?このタイプの情報はすべて実行時に消去されるので、DRYの原則に違反しない限り、これを行う方法については正直に考えられません。私はコードのにおいと考えています。

アイデア?

答えて

2

プロパティまたはアクセサリーDecoratorsを使用するとよいでしょう。

その方法は、次のと同様にあなたの特性をマークすることができます。

export type RoomForClient = { 
    @SafeForClient 
    id: number; 
    ... 
} 

注:これは反映-メタデータライブラリが必要になります。

関連する問題