function Before(namespace = 'default') {
return function (target, key:string, descriptor) {
target[namespace] = target[namespace] || {};
target[namespace].before = descriptor.value;
}
}
function After(namespace = 'default') {
return function (target, key:string, descriptor) {
target[namespace] = target[namespace] || {};
target[namespace].after = descriptor.value;
}
}
function Around(namespace = 'default') {
return function (target, key:string, descriptor) {
let originMethod = descriptor.value;
console.log(descriptor.value.toString());
descriptor.value = async function (...args) {
let fns = target[namespace];
if(!fns) {
originMethod.apply(this, args);
return ;
}
fns.before && await fns.before.apply(this);
await originMethod.apply(this, args);
fns.after && await fns.after.apply(this);
};
}
}
/**
* 多个装饰器时,位置靠上的装饰器取的是前一个装饰器的descriptor.value
* 改descriptor.value 会影响target.value,能够传递给下一个装饰器
* 不要改target[key] 因为改了会不起作用
*/
function Log(target, key:string, descriptor) {
let originMethod = descriptor.value;
descriptor.value = async function () {
console.log('执行了');
await originMethod();
console.log('执行完成');
}
}
class Test {
@Before()
showName() {
console.log('My name is tujiawei');
}
@After()
showAll() {
console.log('显示我的所有信息');
}
@Around()
@Log
showAge() {
console.log('My age is 20');
}
}
let t = new Test();
t.showAge();
typescript装饰器 AOP ??
猜你喜欢
转载自www.cnblogs.com/tujw/p/12403665.html
今日推荐
周排行