2016-01-26 9 views
6

Ho il seguente po 'di classe a macchina, con alcuni campi pubblici decorati:Come si ottiene il tipo di elemento dell'array in TypeScript utilizzando l'API Reflection?

class Company { 
    @dataMember 
    public name: string; 

    @dataMember 
    public people: Person[]; 
} 

class Person { 
    // ... 
} 

Utilizzando reflect metadata, posso determinare i tipi di proprietà dell'azienda name e persone: sono le funzioni di costruzione String e Array, rispettivamente, che è previsto e logico.

La mia proprietà funzione decoratore:

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

Ma come avrei potuto determinare il tipo (funzione di costruzione) di serie elementi? È possibile? Nell'esempio sopra, dovrebbe essere (un riferimento a) Persona.


Nota: ho bisogno del riferimento di tipo prima esemplificazione, e per questo, non è possibile determinare in modo dinamico tipo utilizzante elementi di matrice: non vi sono elementi di matrice, non c'è nemmeno un'istanza Array.

risposta

3

Non penso che sia possibile al momento. Se vedi il file js generato, per array di qualsiasi cosa, crea metadati con tipo come Array senza alcuna informazione sul tipo.

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

Per tipi built-in, un modo ho potuto pensare di risolvere questo problema è quello di passare il tipo di decoratore per sé e scrivere la logica personalizzata nel codice decoratore.

@dataMember(String) 
myProp: Array<String> 

Per gli oggetti personalizzati, la maggior parte delle volte che viene attivata la chiamata decoratore, il modulo non è completamente caricato. Quindi, un modo è quello di passare il nome della classe e analizzarlo in seguito.

@dataMember("People") 
people: People[]