[原创]TypeScript-类装饰器
类装饰器
顾名思义,类装饰器即是用来对类进行装饰的,为什么需要对类进行装饰呢?装饰类的哪些内容呢?在回答这两个问题之前,我们先来看类中的一个东西:构造函数。
在开发中,我们有时会声明一个带有构造函数的类,用来进行一些类的初始化工作。如下面这个类,构造函数用来对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