2017-02-26 8 views
0

デコレータを使ってクラスを拡張したいのですが、その正確さは分かりません。TypeScriptのデコレータでクラスを拡張する

function Foo(value: string) { 
    return function(target: Function) { 
     let injected = Object.assign(target.prototype, { foo: value }); 
     return injected; 
    } 
} 

@Foo("Hello world") 
class Bar { 
} 

let instance = new Bar(); 
console.log(instance.foo); // Should say "Hello World" 

をしかし、私はもう私のクラスをインスタンス化することはできません:「例外TypeErrorは:バーはコンストラクタではありません」次のように私の現在のアプローチがあります。

私のミスはどこですか?

答えて

1

デコレータから新しいオブジェクトを返す必要はありません。この場合、ターゲットオブジェクトが変更されますので、ちょうど

function Foo(value: string) { 
    return function(target: Function) { 
    Object.assign(target.prototype, { foo: value }); 
    } 
} 

+0

は、悲しいことに、これは動作しません正常に動作する必要があります。 'bar'オブジェクトは変更されず、' instance.foo'の結果は 'Property 'foo'が 'Bar'型には存在しません。 – nehalist

+0

@nehalistあなたのtsconfigに 'experimentalDecorators'フラグがありますか?私のローカルとプレイグラウンドで動作していますhttps://www.typescriptlang.org/play/ –

+0

@nehalistしかし、あなたがタイプスクリプトからの警告について話しているのであれば、それはTSコンパイラがこのプロパティを解決できないからです。プレイリストで生成されたJSを確認してください –

関連する問題