2016-12-02 3 views
1

クラスプロパティを列挙できないようにするために、TypeScriptでデコレータを作成したいと考えています。プロパティのTypeScript @enumerable(false)デコレータの作成方法

私はここ@enumerableの例が見つかりました: https://www.typescriptlang.org/docs/handbook/decorators.html#method-decorators をしか方法はなく、プロパティのために働くように見えること:Aプロパティ記述子を引数として提供されていない

https://www.typescriptlang.org/docs/handbook/decorators.html#property-decorators

NOTE TypeScriptでプロパティデコレータがどのように初期化されるかに起因するプロパティデコレータ。これは、現在、 プロトタイプのメンバを定義するときにインスタンスプロパティを記述するためのメカニズムがないため、プロパティの初期化子を観察または変更する方法がないためです。 のように、プロパティデコレータは、特定の名前のプロパティ がクラスに対して宣言されていることを観察するためにのみ使用できます。

クラスプロパティに@enumerableデコレータを作成する方法はありますか?私はこの解決策になってしまった

おかげ

答えて

4

/** 
* @enumerable decorator that sets the enumerable property of a class field to false. 
* @param value true|false 
*/ 
function enumerable(value: boolean) { 
    return function (target: any, propertyKey: string) { 
     let descriptor = Object.getOwnPropertyDescriptor(target, propertyKey) || {}; 
     if (descriptor.enumerable != value) { 
      descriptor.enumerable = value; 
      Object.defineProperty(target, propertyKey, descriptor) 
     } 
    }; 
} 

使用法:

class User { 
    id:string; 

    @enumerable(false) 
    name: string; 
} 

テスト:

var user = new User(); 
    user.id = 1; 
    user.name = 'John Doe'; 
    for (key in user){ console.log(key, user[key]);} 

出力

デコレータを使用することなく、3210
id 1 

同じテスト

id 1 
name John Doe 
関連する問題