[原创]TypeScript-类装饰器

作者: wxfeng 分类: 未分类 发布时间: 2017-07-03 00:00    阅读 795 次

类装饰器

顾名思义,类装饰器即是用来对类进行装饰的,为什么需要对类进行装饰呢?装饰类的哪些内容呢?在回答这两个问题之前,我们先来看类中的一个东西:构造函数。

在开发中,我们有时会声明一个带有构造函数的类,用来进行一些类的初始化工作。如下面这个类,构造函数用来对hello这个属性进行值的初始化操作,当创建对象时,会将传入的“world”赋值给hello这个属性。

class Greeter {
    property = "property";
    hello: string;    
    constructor(m: string) {
       this.hello = m;
    }
}
console.log(new Greeter("world"));
//控制台输出:Object { property: "property", hello: "world" }

随着项目发展,需求发生了变动,在使用类Greeter时,需要对传入的参数进行一些修饰(添加一个新的属性:newProperty,将hello属性重新赋值,使其与用户传递参数无关),但是由于类似Greeter这样的类在项目中有许多,如果一个个修改,工作量比较大,为了避免这个问题,便可以在项目中定义一个装饰器,用来处理这个问题,如下所示:

function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        newProperty = "new property";
        hello = "override";
    }
}

创建完装饰器后,便可在所有类似于Greeter这样的类声明之前,引用装饰器,来对类中的构造函数进行修改,来减少代码的书写量,完整的代码如下:

function classDecorator<T extends {new(...args:any[]):{}}>(constructor:T) {
    return class extends constructor {
        newProperty = "new property";
        hello = "override";
    }
}

@classDecorator
class Greeter {
    property = "property";
    hello: string;
    constructor(m: string) {
            this.hello = m;
    }
}
console.log(new Greeter("world"));
//控制台输出:Object { property: "property", hello: "override", newProperty: "new property" }

总结:


为什么需要对类进行装饰呢?

在需求发生变动时,需要对许多类的构造函数重新进行定义或修改,如果一个个修改,工作量将非常的大,为了减少代码的编写以及业务需求的准确性,所有需要变动的类统一使用同一个装饰器进行修饰,便可轻松准确的实现对类构造函数进行修改的目的,也便于日后的维护。

装饰类的哪些内容呢?

类装饰器即对类的构造函数进行监视,修改或替换。

官方文档:https://www.tslang.cn/docs/handbook/decorators.html#class-decorators

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。