2017-01-18 8 views
0

次のサンプルコードを使用する場合代わり日のオブジェクトが期待どおりに動作し、プリントアウトされた「は、[機能:日付」活字体Reflect.getMetadata(「デザイン:タイプ」..)戻り角度2スタックは

import 'reflect-metadata' 
function logType(target : any, key : string) { 
    var t = Reflect.getMetadata("design:type", target, key); 
    console.log(`${key} type: ${t.name}`); 
    } 
export class Demo { 
    @logType // apply property decorator 
    test: Date; 
} 
let demo = new Demo(); 
console.log(Reflect.getMetadata('design:type', demo, "test")); 

Angular 2 Projectで同じコードを配置すると、 "function Object(){[native code]}"が返されます。 https://plnkr.co/edit/DhXT89U0q5fCOWlCrx6w?p=preview

Reflect.getMetadata:

私はこのためにPlunkerを用意し( 'デザイン:タイプ' を...)まだカスタムクラスとその他の組み込みのクラスのために働いています。私はこの問題をDateでしか生成できませんでした。

私は間違っていますか?

+0

をプリントアウトします私は、しかし、角度を使用していない同じ問題を抱えていました。私の場合は、TypeScriptローダー(ts-loader)のtranspileOnly設定が出力に影響していました。この設定を有効にすると、戻り値の型はDateではなくObjectになります。 – rgarcia

答えて

2

あなたが関数を実行する必要がある、とだけ...そこにそれを入れていない:)、あなたはこのような何かにあなたの@logType機能を変更する必要がある一方@logType

export class Demo { 
    @logType() // add parentheses 
    test: Date; 
} 

の後に括弧を追加する必要があります。あなたは、このように呼び出すことができます

function logType(type: any) { 
    return function(target: any, propertyKey: string) { 
    Reflect.defineMetadata('design:type', type, target, propertyKey); 
    } 
} 

export class Demo { 
    @logType(Date) // apply property decorator 
    test: Date; 
} 

私は私が何を意味するか表示するplnkrを更新しました: plnkr

あなたが唯一の組み込み型でstringbooleannumberまたはobjectのいずれかを取得することができます。 objectは、DateArrayMathWeakMapのいずれかになります。すべての組み込み関数はObjectと評価されますが、これがバグかどうか、または設計上の確かさはわかりません。

ただし、カスタムクラスを取得するためにメソッドを使用することはできます。あなたは

export class Demo { 
    @logType 
    test: Demo; 
} 

を行いたい場合にはDemo

+0

デコレータには()は必要ありません。実際、typescriptコンパイラはエラーをスローします。この関数も呼び出されます(ちょうどプランカーのコンソールで見てください) –

+0

私が知る限り、実際に型を渡さずに '@ logType'だけを使って型を取得することはできません。私はあなたが望むものを得るために私の答えを更新しました。しかし、私は間違っている可能性があります。私がデコレータに関する研究をしてからしばらくして、仕様が変更されている可能性があります。 – PierreDuc

+0

あなたの編集をありがとう、私はこれを回避策として使用しようとします。通常、emitDecoratorMetadataコンパイラオプションはこのhttps://www.typescriptlang.org/docs/handbook/decorators.htmlを処理する必要があります。私はまだそれが何か他のものでなければならないと思っています。角度なしで期待通りに働いているように2 –

関連する問題