Można użyć refleksji importując pakiet reflect-metadata.
import 'reflect-metadata';
Użyj go z maszynopis 1,5 i flag kompilatora emitDecoratorMetadata
wartość true. Nie zapomnij także o odwołaniu do reflect-metadata.d.ts
.
Trzeba wdrożyć własne dekoratorów:
// 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;
}
Będzie zalogować konsoli:
attr1 type: String
Inny przykład:
// 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
}
}
Będzie logowaniu w konsoli:
doSomething param types: String, Number, Foo, Object, Object, Function, Function
Należy zauważyć, że interfejsy IFoo
i literał obiektowy { test : string}
są serializowane jako Object
.Zasady serializacji są:
number
szeregowane jako Number
string
odcinkach jako String
boolean
szeregowane jako Boolean
any
serializowane jako Object
void
serializes jak undefined
Array
szeregowane jako Array
- Jeżeli
Tuple
, szeregowane jako Array
- Jeśli
class
szeregowane jako konstruktora klasy
- Jeśli
Enum
szeregowane jako Number
- Jeśli ma przynajmniej jeden podpis połączeń, serializowanym jak
Function
- W przeciwnym razie jest serializowany pod numerem
Object
(w tym interfejsy)
Interfejsy i obiekty mogą być serializowane w przyszłości poprzez serializację złożonych typów, ale ta funkcja nie jest obecnie dostępna.
Można również uzyskać typ zwracanej funkcji przy użyciu:
Reflect.getMetadata("design:returntype", target, key);
Jeśli potrzebujesz więcej informacji na temat dekoratorów można przeczytać: Decorators & metadata reflection in TypeScript: From Novice to Expert
[tutaj] (http://blogs.msdn.com/b/typescript/archive/2015 /04/30/announcing-typescript-1-5-beta.aspx) jest przykładem. Nie udało mi się go uruchomić z PhantomJS 2, który właśnie zgłosił błąd składni. –
Jaki jest Twój ostateczny cel? Jeśli mógłbyś podać przykład, to pomogłoby ci odpowiedzieć na twoje pytanie. – zlumer