TypeScript21(装饰器Decorator)
创始人
2024-03-16 05:17:39
0

Decorator 装饰器是一项实验性特性,在未来的版本中可能会发生改变

不仅增加了代码的可读性,清晰地表达了意图,而且提供一种方便的手段,增加或修改类的功能;

若要启用实验性的装饰器特性,你必须在命令行或tsconfig.json里启用编译器选项

b83a8749f797448390f9128235c48237.png

 装饰器

装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上。

首先定义一个类

class A {constructor() {}
}

定义一个类装饰器函数 他会把ClassA的构造函数传入你的watcher函数当做第一个参数

const watcher: ClassDecorator = (target: Function) => {// 因为console.log(target)返回的是class类,所以可以在原型上添加函数target.prototype.getParams = (params: T):T => {return params}
}

使用的时候 直接通过@函数名使用

@watcher
class A {constructor() {}
}

验证

const a = new A();
console.log((a as any).getParams('123'));

完整写法如下:

const watcher:ClassDecorator = (target:Function) => {console.log(target);target.prototype.getName = (name:T):T => {return name}}@watcher
class A {}let a = new A();(a).getName()
console.log((a).getName('小剑'));

装饰器工厂

其实也就是一个高阶函数 外层的函数接受值 里层的函数最终接受类的构造函数

const watcher = (name: string): ClassDecorator => {return (target: Function) => {target.prototype.getParams = (params: T): T => {return params}target.prototype.getOptions = (): string => {return name}}
}@watcher('name')
class A {constructor() {}
}const a = new A();
console.log((a as any).getParams('123'));

装饰器组合

就是可以使用多个装饰器

const watcher = (name: string): ClassDecorator => {return (target: Function) => {target.prototype.getParams = (params: T): T => {return params}target.prototype.getOptions = (): string => {return name}}
}
const watcher2 = (name: string): ClassDecorator => {return (target: Function) => {target.prototype.getNames = ():string => {return name}}
}@watcher2('name2')
@watcher('name')
class A {constructor() {}
}const a = new A();
console.log((a as any).getOptions());
console.log((a as any).getNames());

方法装饰器

返回三个参数:

        对于静态成员来说是类的构造函数,对于实例成员来说是类的原型对象;

        成员的名字;

        成员的属性描述符;

[{},'setParasm',{value: [Function: setParasm],writable: true,enumerable: false,configurable: true}
]
const met:MethodDecorator = (...args) => {console.log(args);
}class A {constructor() {}@metgetName ():string {return '小满'}
}const a = new A();

属性装饰器

返回两个参数:

        对于静态成员来说是类的构造函数,对于实例成员来说是类的原型对象;

        属性的名字

[ {}, 'name', undefined ]

const met:PropertyDecorator = (...args) => {console.log(args);
}class A {@metname:stringconstructor() {}}const a = new A();

参数装饰器

返回三个参数

        对于静态成员来说是类的构造函数,对于实例成员是类的原型对象;

        成员的名字;

        参数在函数参数列表中的索引

[ {}, 'setParasm', 0 ]

const met:ParameterDecorator = (...args) => {console.log(args);
}class A {constructor() {}setParasm (@met name:string = '213') {}
}const a = new A();

 

 

相关内容

热门资讯

*ST节能(000820)披露... 截至2025年12月26日收盘,*ST节能(000820)报收于3.36元,较前一交易日上涨0.9%...
疑电芯质量存问题,500亿巨头... 二线电池厂商欣旺达(300207.SZ)被起诉了! 12月26日盘后,欣旺达披露公告称,公司子公司欣...
央行报告:加强房地产金融宏观审... 每经AI快讯,据央行网站12月26日消息,中国人民银行近日发布了《中国金融稳定报告(2025)》。报...
济南起步区“民生政策进社区”活...   鲁网12月26日讯深冬微寒,社区里却暖意融融。在起步区崔寨街道凤凰理想社区的小广场上,一排排政策...
振芯科技召开临时股东大会 三项... 围绕振芯科技(300101)的控制权纷争已延续数年之久,如今,双方又针对多项上市公司相关治理制度修订...
吉利威睿起诉欣旺达动力:因电芯... 据悉,吉利旗下威睿电动汽车技术(宁波)有限公司起诉欣旺达动力科技股份有限公司,索赔金额高达23亿元。...
央行:将实施更加积极有为的宏观... 近日,中国人民银行发布了《中国金融稳定报告(2025)》。下一步,金融系统将实施更加积极有为的宏观政...
阳西各镇妇联开展农村妇女法律讲... 12月以来,阳西县妇联联合阳西县司法局,组织各镇开展农村妇女法律讲座系列活动,旨在深入贯彻落实法治乡...
重构人才评价体系 成都东部新区... 封面新闻记者 柴枫桔 12月26日,成都东部新区产业人才政策发布会暨2025年四季度“双招双引”投资...
“鲜”人一步!自贸试验区昆明片... 目前,中国是全球最大的榴莲进口国,占全球市场份额90%以上,云南榴莲进口量已跃居全国第二、西部第一。...