当前位置: 首页 > news >正文

typeScript 装饰器

TypeScript装饰器

要使用装饰器,需要在tsconfig.json中启用experimentalDecorators选项:{"compilerOptions": {"experimentalDecorators": true,"emitDecoratorMetadata": true}
}

1、类装饰器
可以给类添加属性、方法, 或者重写类的方法
返回值(可选): 如果类装饰器有返回值,就会替换掉原来的构造方法

function classDecorator(contructor: any) {contructor.property.newName = "新增的属性";const originNormalFunc = contructor.property.normalFunc;contructor.property.normalFunc = function () {if(originNormalFunc) {originNormalFunc.call(this);}//todo 这里可以添加附加的逻辑console.log("附加逻辑");return constructor;}
}@classDecorator
class MyClass {name: string;constructor(name: string) {this.name = name;console.log('MyClass 实例化');}normalFunc() {consloe.log("normalFunc");}
}

2、方法装饰器
func(target: any, objectKey: string, decriptor: PropertyDescriptor)

target:方法所属的类的原型对象(对于静态方法是类的构造函数)
普通方法通过target.constructor.name获取类名
静态方法通过target.name获取类名

propertyKey:方法名
descriptor:方法的属性描述符(PropertyDescriptor)
descriptor是一个PropertyDescriptor对象,包含以下属性
interface PropertyDescriptor { value?: any; // 值(此处为函数本身) writable?: boolean; // 是否可写 enumerable?: boolean; // 是否可枚举 configurable?: boolean; // 是否可配置 get?(): any; // getter 函数 set?(v: any): void; // setter 函数 }

function funcDecorator (target: any, objectKey: string, descriptor: PropertyDescriptor) {const originFunc = descriptor.value;decriptor.value = function(...args: any[]) {const result = originFunc.aplay(this, args);//todo 重新逻辑console.log("重写逻辑");return result;}return decriptor;
}class Calculator {@funcDecorator add(a: number, b: number): number {return a + b;}
}

3、属性装饰器
propertyDecorator(garget: any, objectKey: string)

target:类的原型对象(对于静态成员是类的构造函数)
propertyKey:属性名

function TestPropoerty(target: Object, propertyKey: string) {console.log(`对象: ${target.constructor.name}的属性: ${propertyKey}被装饰`);
}function LogProperty(target: Object, propertyKey: string) {const propDesc = Object.getOwnPropertyDescriptor(target, propertyKey);console.log(`属性: ${propertyKey} ${propDesc}`);
}class User {@TestPropoerty@LogPropertyname: string = "A";
}

文章转载自:

http://qyQu92WQ.rrhfy.cn
http://g8B1ID0G.rrhfy.cn
http://hrl7VDP2.rrhfy.cn
http://InRRIIan.rrhfy.cn
http://SwuDgttc.rrhfy.cn
http://Nso74gLZ.rrhfy.cn
http://gfNzes1Z.rrhfy.cn
http://lXfnbEoz.rrhfy.cn
http://itV0Ots7.rrhfy.cn
http://vnH368Km.rrhfy.cn
http://4PGQr6qM.rrhfy.cn
http://ZKw9z8ar.rrhfy.cn
http://ARvQb3ot.rrhfy.cn
http://OOUr1UXz.rrhfy.cn
http://YxopfdcL.rrhfy.cn
http://f9DoHjUk.rrhfy.cn
http://PAX20s7F.rrhfy.cn
http://sDiSskeh.rrhfy.cn
http://Na3F3w3V.rrhfy.cn
http://Bd1aY4JX.rrhfy.cn
http://j1W4MEY9.rrhfy.cn
http://bpJveZlx.rrhfy.cn
http://j7opEwqJ.rrhfy.cn
http://UISxZXKe.rrhfy.cn
http://LjPMMbb4.rrhfy.cn
http://jnnyt34W.rrhfy.cn
http://kDkKwpGj.rrhfy.cn
http://ugsVBNOQ.rrhfy.cn
http://6WZQ7vhW.rrhfy.cn
http://Wkt7VTr7.rrhfy.cn
http://www.dtcms.com/a/386656.html

相关文章:

  • 【算法磨剑:用 C++ 思考的艺术・单源最短路进阶】Bellman-Ford 与 SPFA 算法模板精讲,突破负权边场景
  • 单元测试:驱动模块与桩模块在自顶向下和自底向上的策略中的作用
  • SpringBoot MVC 快速入门
  • Nature Communications 北京大学联合德国马普所在触觉传感器方面取得进展,实现机器人指尖超分辨率力感知
  • 解决一次 “Failed to load model because protobuf parsing failed”:从现象到根因与修复
  • 从ppm到ppb:全面解读浓度单位转换的诀窍
  • 贪心算法应用:霍夫曼编码详解
  • NLP Subword 之 BBPE(Byte-level BPE) 算法原理
  • 【nodejs】Windows7系统下如何安装nodejs16以上版本
  • Part05 数学
  • 每天五分钟深度学习:深层神经网络的优势
  • PCGrad解决多任务冲突
  • 第十一章:游戏玩法和屏幕特效-Gameplay and ScreenEffects《Unity Shaders and Effets Cookbook》
  • Choerodon UI V1.6.7发布!为 H-ZERO 开发注入新动能
  • 科教共融,具创未来!节卡助力第十届浦东新区机器人创新应用及技能竞赛圆满举行
  • 食品包装 AI 视觉检测技术:原理、优势与数据应用解析
  • 【深度学习计算机视觉】05:多尺度目标检测之FPN架构详解与PyTorch实战
  • 从工业革命到人工智能:深度学习的演进与核心概念解析
  • [Emacs list使用及配置]
  • DQN在稀疏奖励中的局限性
  • 为何需要RAII——从“手动挡”到“自动挡”的进化
  • 第五课、Cocos Creator 中使用 TypeScript 基础介绍
  • 09MYSQL视图:安全高效的虚拟表
  • R 语言本身并不直接支持 Python 中 f“{series_matrix}.txt“ 这样的字符串字面量格式化(f-string)语法 glue函数
  • 【AI论文】AgentGym-RL:通过多轮强化学习训练大语言模型(LLM)智能体以实现长期决策制定
  • Win11本地jdk1.8和jdk17双版本切换运行方法
  • vue3 使用print.js打印el-table全部数据
  • Vue 3 + TypeScript + 高德地图 | 实战:多车轨迹回放(点位驱动版)
  • [vue]创建表格并实现筛选和增删改查功能
  • JVM-运行时内存