typescript装饰器 AOP ??

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();

猜你喜欢

转载自www.cnblogs.com/tujw/p/12403665.html