Вы можете использовать отражение, импортировав пакет reflect-metadata.
import 'reflect-metadata';
Используйте его с TypeScript 1.5 и флагом компилятора emitDecoratorMetadata
, установленным в true. Не забудьте также включить ссылку на reflect-metadata.d.ts
.
Вам нужно реализовать свои собственные декораторы:
// 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;
}
Он войдет в консоль:
attr1 type: String
Другой пример:
// 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
}
}
Он войдет в консоль:
doSomething param types: String, Number, Foo, Object, Object, Function, Function
Обратите внимание, что интерфейсы IFoo
и объектный литерал { test : string}
сериализуются как Object
. Правила сериализации:
number
сериализовано как Number
string
серийный номер String
boolean
серийный номер Boolean
any
серийный номер Object
void
сериализуется как undefined
Array
серийный номер Array
- Если
Tuple
, серийный номер Array
- Если
class
сериализует его как конструктор класса
- Если
Enum
сериализует его как Number
- Если есть хотя бы один позывной, сериализованный как
Function
- В противном случае сериализуется как
Object
(включая интерфейсы)
В будущем интерфейсы и литералы объектов могут быть сериализованы с помощью сериализации сложных типов, но в настоящее время эта функция недоступна.
Вы также можете получить возвращаемый тип функции, используя:
Reflect.getMetadata("design:returntype", target, key);
Если вам нужна дополнительная информация о декораторах, вы можете прочитать: Декораторы и отражение метаданных в TypeScript: от новичка до эксперта
person
Remo H. Jansen
schedule
27.08.2015