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'});
  • 相关阅读:
    cudnn的下载地址
    rbg大神的主页
    ubuntu16.04上安装深度学习基本框架caffe2 pytorch tensorflow opencv
    linux sublime python
    ubuntu打开终端多开标签的快捷键是ctrl+ shift+ T 对比ctrl+ alt+ T 另外窗口打开一个终端
    在ubuntu1604上使用aria2下载coco数据集效率非常高
    MS coco数据集下载
    qtav----ffmeg在ubuntu和win10上的编译和运行
    论文预印版本的网站 https://arxiv.org/
    pip或者anacnda安装opencv以及opencv-contrib
  • 原文地址:https://www.cnblogs.com/Answer1215/p/8403077.html
Copyright © 2011-2022 走看看