TypeScript - 装饰器

1. 装饰器就是一个方法, 可以注入到类/方法/属性/参数上来扩展其功能


2. 类装饰器 (普通装饰器)

    // 声明装饰器, clazz会接收到使用这个装饰器的类
    function fnDemo(clazz: any) {
        // 扩展属性
        clazz.prototype.value = '扩展属性';
        // 扩展方法
        clazz.prototype.run = function() {
            console.log('扩展方法');
        }
    }

    // 使用装饰器, 在类上直接加
    @fnDemo() 
    class Demo {
    }

    var demo: any = new Demo();
    console.log(demo.value);
    demo.run();


3. 类装饰器 (装饰器工厂, 可传参)

    function fnDemo(value: string) {
        return function (clazz: any) {
            clazz.prototype.value = value;
            clazz.prototype.run = function() {
                console.log('扩展方法');
            }
        }
    }

    @fnDemo('hello')
    class Demo {
    }

    var demo: any = new Demo();
    console.log(demo.value);
    demo.run();


4. 属性装饰器

    function fnDemo(value: string) {
        // clazz: 类原型对象
        // attr: 属性名
        return function (clazz: any, attr: any) {
            clazz[attr] = value;
        }
    }

    class Demo {
        @fnDemo('hello') 
        value: string | undefined;
    }

    var demo: any = new Demo();
    console.log(demo.value);


5. 方法装饰器

    function fnDemo(value: string) {
        // clazz: 类原型对象
        // methodName: 方法名
        // desc: 方法描述
        return function (clazz: any, methodName: any, desc: any) {
            // ...
        }
    }


5. 方法参数装饰器
function fnDemo(value: string) { // clazz: 类原型对象 // methodName: 方法名 // paramsIndex: 参数的索引位置(从0开始) return function (clazz: any, methodName: any, paramsIndex: any) { // ... } } 6. 装饰器的执行顺序 属性装饰器 -> 方法装饰器 -> 方法参数装饰器2 -> 方法参数装饰器1 -> 类装饰器2 -> 类装饰器1 注: 装饰器可以写多个, 如果有多个装饰器, 会先执行后面的

 

posted @ 2020-07-10 10:28  萌胖次  阅读(216)  评论(0编辑  收藏  举报