zoukankan      html  css  js  c++  java
  • [Typescript] Build Method decorators in Typescript

    To using decorate, we can modifiy tsconfig.json:

    {
      "compilerOptions": {
        ...
        "experimentalDecorators": true,
        ...  
      }
    }

    So for example we want to build a '@LogMethod' decorator, which arroding to the system logging level to decide whether should log the action.

    enum LoggingLevel {
        INFO,
        WARNING,
        DEBUG,
        TRACE
    }
    const loggingLevel = LoggingLevel.DEBUG;
    
    class Database {
        name = 'ABC';
    
        @LogMethod(LoggingLevel.DEBUG)
        saveData(data: any) {
            console.log(`save user ${data.name} to the database ${this.name}`);
        }
    }
    
    const db = new Database();
    db.saveData({name: 'zhentian'});

    So for example, current is 'DEBUG' for the system, so when log level set to the 'DEBUG' or 'TRACE', action will be logged, 'INFO', 'WARNING' will be not.

    Decorator:

    which is simplya function return a meta function:

    function LogMethod(level: LoggingLevel):Function {
        return (target: any, propertyKey: string,
                descriptor: PropertyDescriptor) => {
        }
    
    }

    If we log out each params:

    'descriptor' is something we are looking for, 'descriptor.value' holding the function which is 'saveData' function, we can put into a variable:

    const originalFunction:Function = descriptor.value;

    Then we can create a new function to wrap this 'originalFunction' in order to provide some additional functionality:

            descriptor.value = function(...args:any[]) {
                if (level <= loggingLevel) {
                    console.log(">> " + propertyKey + " " +  JSON.stringify(args));
                }
    
                originalFunction.apply(this,args);
            };

    Full code:

    enum LoggingLevel {
        INFO,
        WARNING,
        DEBUG,
        TRACE
    }
    const loggingLevel = LoggingLevel.DEBUG;
    
    function LogMethod(level: LoggingLevel):Function {
        return (target: any, propertyKey: string,
                descriptor: PropertyDescriptor) => {
    
            const originalFunction:Function = descriptor.value;
    
            descriptor.value = function(...args:any[]) {
                if (level <= loggingLevel) {
                    console.log(">> " + propertyKey + " " +  JSON.stringify(args));
                }
    
                originalFunction.apply(this,args);
            };
    
    
        }
    
    }
    
    class Database {
        name = 'ABC';
    
        @LogMethod(LoggingLevel.DEBUG)
        saveData(data: any) {
            console.log(`save user ${data.name} to the database ${this.name}`);
        }
    }
    
    const db = new Database();
    db.saveData({name: 'zhentian'});
  • 相关阅读:
    视频监控,硬盘录像机安装
    路由器、集线器和三层交换机有何不同
    九选六?九选三?
    Access数据转换为XML格式
    硬盘录像显示器显示画面有抖动感
    硬盘录像机开机监视一段时间后,显示器出现屏幕保护或者黑屏
    庆祝还活着
    天津之旅
    武汉之旅
    从今天起~~~
  • 原文地址:https://www.cnblogs.com/Answer1215/p/8403077.html
Copyright © 2011-2022 走看看