È possibile utilizzare riflessione importando il pacchetto reflect-metadata.
import 'reflect-metadata';
utilizzarlo con dattiloscritto 1.5 e il compilatore di bandiera emitDecoratorMetadata
impostato su true. Non dimenticare di includere anche un riferimento a reflect-metadata.d.ts
.
è necessario implementare le proprie decoratori:
// declare property decorator
function logType(target : any, key : string) {
var t = Reflect.getMetadata("design:type", target, key);
console.log(`${key} type: ${t.name}`);
}
class Demo{
@logType // apply property decorator
public attr1 : string;
}
Sarà il login console:
attr1 type: String
Un altro esempio:
// declare parameter decorator
function logParamTypes(target : any, key : string) {
var types = Reflect.getMetadata("design:paramtypes", target, key);
var s = types.map(a => a.name).join();
console.log(`${key} param types: ${s}`);
}
class Foo {}
interface IFoo {}
class Demo{
@logParameters // apply parameter decorator
doSomething(
param1 : string,
param2 : number,
param3 : Foo,
param4 : { test : string },
param5 : IFoo,
param6 : Function,
param7 : (a : number) => void,
) : number {
return 1
}
}
Sarà il login console:
doSomething param types: String, Number, Foo, Object, Object, Function, Function
Si noti che le interfacce IFoo
e l'oggetto letterale { test : string}
sono serializzate come Object
.Le regole di serializzazione sono:
number
serializzato come Number
string
serializzato come String
boolean
serializzato come Boolean
any
serializzato come Object
void
serializza come undefined
Array
serializzato come Array
- Se un
Tuple
, serializzato come Array
- Se un
class
serializzato come il costruttore della classe
- Se un
Enum
serializzato come Number
- Se ha almeno una firma di chiamata, serializzato come
Function
- Altrimenti serializzato come
Object
(interfacce Compreso)
Le interfacce e gli oggetti letterali possono essere serializzati in futuro tramite la serializzazione di tipo complesso ma questa funzione non è disponibile al momento.
È anche possibile ottenere il tipo di ritorno di una funzione tramite:
Reflect.getMetadata("design:returntype", target, key);
Se avete bisogno di più informazioni su decoratori si può leggere: Decorators & metadata reflection in TypeScript: From Novice to Expert
[qui] (http://blogs.msdn.com/b/typescript/archive/2015 /04/30/announcing-typescript-1-5-beta.aspx) è un esempio. Non ho avuto modo di lavorare con PhantomJS 2 che ha appena segnalato un errore di sintassi. –
Qual è il tuo obiettivo finale? Se potessi fornire un esempio, sarebbe utile rispondere alla tua domanda. – zlumer