2016-01-13 13 views
12

How to implement a typescript decorator?は、typescriptでデコレータを使用する方法の良い例です。以下の場合、インスタンス変数をtypescriptデコレータ引数に渡すにはどうすればいいですか?

class MyClass { 
    @enumerable(false) 
    get prop() { 
     return true; 
    } 

    @property({required: true}) //here pass constant is no issue 
    public startDateString:string; 

    @property({afterDate: this.startDateString}) //how to pass startDateString here? 
    public endDateString:string; 
} 

function enumerable(isEnumerable: boolean) { 
    return (target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) => { 
     descriptor.enumerable = isEnumerable; 
     return descriptor; 
    }; 
} 

を考慮

私はすべてを試みたが、私がデコレータ引数にstartDateStringを渡す方法がありませんようです。 startDateStringは、変数、関数、および参照になります。

+0

これは、渡された値を使用する必要がある_how_と_ _hen_によって可能になる場合があります。私はあなたが 'endDateString'に適用されたデコレータに' startDateString'の_erance value__instance value_を渡す必要があるのですが、デコレータで何を_do_する予定ですか?場合によっては、デコレータを介してインスタンスメンバを取得することも可能です。 –

答えて

6

あなたがしようとしていることはできません。

クラスが宣言されているときにデコレータが呼び出され、この時点でデコレータに渡すインスタンスはありません。このコードの例

class MyClass { 
    startDateString: string; 
    @property({ afterDate: this.startDateString }) 
    endDateString: string; 
} 
let myClass = new MyClass(); 
  1. MyClassが宣言されます。
  2. デコレータはMyClassで実行されます。この時点で渡すインスタンスは存在せず、デコレータ引数のthisは、インスタンスではなくグローバルオブジェクトを参照します。
  3. new MyClass()が呼び出され、インスタンスが作成されます。デコレータはこのステップで呼び出されません。それはすでに起こった。

は、参照用にコンパイルされたJavaScriptを見てみましょう:

var MyClass = (function() { 
    // -- 1 -- 
    function MyClass() { 
    } 
    // -- 2 -- 
    __decorate([ 
     // see here... `this` is equal to the global object 
     property({ afterDate: this.startDateString }) 
    ], MyClass.prototype, "endDateString", void 0); 
    return MyClass; 
})(); 
// -- 3 -- 
var myClass = new MyClass(); 

注意をthisanyとして入力されているためthis.startDateStringを使用すると、ここでコンパイルエラーをスローしないこと。

ここで、インスタンスプロパティを渡すことでここで何をしようとしているのかは分かりませんし、不可能です。

あなたができることは、startDateStringを静的にしてから、@property({ afterDate: MyClass.startDateString })のように渡します。

+0

ありがとうございます。しかし私の場合、クラス変数であることは静的ではありません。それはインスタンス変数でなければなりません。 – new2cpp

+0

@ new2cppあなたができることの1つは、クラスのインスタンスを渡された文字列または関数を渡し、プロパティ値を返すことです。 '{afterDate:" startDateString "}"や{{afterDate:(インスタンス:MyClass)=> instance.startDate}のようなものです。プロパティの値を取得するクラスのインスタンスを取得したら、この情報を後で使用することができます。それはコードを見てみんなを混乱させる素晴らしい方法であるハックな解決策です。 –

3

属性定義からオブジェクトプロパティにアクセスすることはできません。

プロパティが定義されると、デコレータが呼び出されます。

プロパティへのアクセス時にgetterまたはsetterを使用してコントロールを取得できます。

関連する問題