2016-01-26 3 views
6

いくつかの公共のフィールドが飾られて、私は、活字体で、次の小さなクラスを持っている:Reflection APIを使用してTypeScriptで配列アイテムタイプを取得するにはどうすればよいですか?

class Company { 
    @dataMember 
    public name: string; 

    @dataMember 
    public people: Person[]; 
} 

class Person { 
    // ... 
} 

reflect metadataを使用することにより、私は会社の特性の種類を判別することができます。彼らは、コンストラクタ関数ですストリングおよびアレイがそれぞれ予期され、論理的です。

私の財産デコレータ機能:

function decorate(target: Object, propertyKey: string | symbol): void { 
    var reflectType = Reflect.getMetadata("design:type", target, propertyKey); 
    // ... 
} 

しかし、どのように、私は、配列要素の型(コンストラクタ関数)を決定することができる?それも可能ですか?上記の例では、Person(参照先)にする必要があります。


注:私は、インスタンス化の前に型参照を必要とし、このため、動的配列のアイテムを使用してタイプを決定することは不可能である:NO配列項目が存在しない、もArrayインスタンスがありません。

答えて

3

これは今のところ考えられていません。生成されたjsファイルが表示された場合は、何かの配列に対して、型の情報を持たずにArray型のメタデータをArrayとして作成します。ビルトインタイプの

__decorate([ 
    dataMember_1.dataMember, 
    __metadata('design:type', Array) 
], Company.prototype, "people", void 0); 

、私はこの問題を解決すると考えることができ一つの方法は、デコレータ自体に種類を渡すことで、デコレータコードでカスタムロジックを記述。

@dataMember(String) 
myProp: Array<String> 

カスタムオブジェクトの場合、デコレータ呼び出しが発生するほとんどの場合、モジュールは完全にロードされていません。したがって、クラス名を渡して後で解析する方法もあります。

@dataMember("People") 
people: People[] 
関連する問題