首发于 我的学习笔记
TS语法之装饰器(注解)

TS语法之装饰器(注解)

写在前面的话

本文只讲解 TypeScript 中的装饰器语法(下称注解), 只会告诉你如何编写一个自定义注解,且通过注解简单的修改逻辑,不涉及 反射 或 元编程 等其他更进一步的代码讲解,如果有兴趣可以自行搜索相关的进阶写法,比如这位: TS从装饰器到注解到元编程

开始

注1:装饰器仅用于 class 语法中,所以以下举例中只会使用 class 写法。(其实是我只测试了 class 语法中的使用,而且也没必要在普通方法上使用注解)

注2:tsconfig.jsontarget 必须为 ES5 或以上版本。且 experimentalDecoratorsemitDecoratorMetadata 字段需为 true

由于我们写的是 TypeScript,我们首先定义几个 interfacetype ,让 IDE 有一些基本提示:

其中,PropertyKeyTypedPropertyDescriptor<T> 都在 lib.es5.d.ts 文件中有定义,其值为:

如果有人不喜欢泛型写法,也可以将 TypedPropertyDescriptor<T> 替换成 PropertyDescriptor

这里使用泛型仅仅是因为我不喜欢 anyPrototype 类型中加上 any 是因为没有办法只能用 any,原因是类型定义中没有办法用 symbol 类型的值定义成 key,否则就可以写成 type Prototype = {[key: string]: Function; [key: number]: Function; [key: symbol]: Function;}
如果有人不知道 PropertyDescriptor 是干嘛的,请参考 Object.defineProperty()

下面我们直接用例子教你如何自定义一个注解。

方法注解

写法:

注:若注解中需要传入参数,参考正常方法的写法添加需要的参数即可,不赘述。(注解与正常方法的区别仅仅在于方法调用前面多了一个@符号而已)

参数详解:

需要注意的是,如果注解中不需要传入任何参数,则可以省略注解中最外层的一层方法,变成如下:

这时,注解则可以写成 @logFuncCall 的形式(去掉了括号),否则括号不能省略。下同,不再赘述。本文并未采用省略写法。

直接编译调试运行如下代码:

这时,控制台中会输出:

Getter/Setter注解

同 方法注解;

与方法注解的区别在于,Getter/Setter 注解的 descriptor 中只有对应的 getset 字段,而 value 字段为 undefined,而方法注解只中有 value 字段,而 getset 字段为 undefined

所以通用的方法注解应该如下:

类注解

写法:

参数详解

上面这种写法适用于大部分情况,类似于继承了被注解的类

如果你不希望任何人重写此类的方法,可以用如下的匿名写法:(在类的 constructor 方法中返回一个对象,则 new 对象时 this 指向该对象,而非类的实例)

这种写法需要注意的是:环境中被注解的类将会变为一个注解返回的匿名内部类,其不继承于原先的类,在类外也无法调用原先类的所有方法,只有使用 new 新建对象后,才会返回一个原先类的对象(除非你在内部类中自己定义了静态方法去调用原先类的静态方法)

被这种写法注解的类如果被继承,则只能在构造函数中对自身做出一定修改,且所有静态方法不可通过类名调用

属性注解

写法:

参数详解

注:propertyKey 是有可能为 symbolnumber 类型的,所以 String() 大概率不能省略

这里需要注意的是:由于注解执行紧跟在类的定义之后,所以如果没有在定义时赋默认值,则 target 中是不会有对应的属性字段的,这时可以选择自己定义 Getter/Setter 然后在其中编写对应的方法,也可以选择在项目中引入 import 'reflect-metadata',使用 反射-元数据 编程(参考本文开头给出的链接 )

如果注解的是静态字段,且在定义时就赋过值,则 target 中将会有对应的属性字段且有值

参数注解

写法:

参数详解

这里除了反射以外好像没别的用法?或者跟方法注解联动,毕竟方法也是对象,是可以保存参数的,案例:

这样同时注解 @logFuncCall()@logParam 之后,就可以打印传入的参数了

结尾

另外附上一些自己写的小案例:

测试案例:

调试 log:

如果类注释采用了匿名写法,则 log 为:

最后,小心溢出,不用

最后,性能太低,不用

最后,还没成真的语法呢,不用

最后,编写一时爽,debug火葬场

装修网东方公司装修130平米房子装修需要多少水泥92平方米装修多少钱124平方装修水电要多少钱家装商城武汉市公装公司毛坯房简装图片北京家装展览会宾馆一个房间装修需要多少钱南阳装修装饰公司精装牛粪别墅简装30万能做到吗常州 装修设计吸尘板装修好不好精装和简装的价格区别承接装修工程资质阁楼简装图片70平简装最少花多少钱106平米的简装效果图上海公装装饰40平公寓简装的多少钱长沙公装装饰公司排名逐鹿公装装修简装效果图深圳乐蜂精装装饰柏麟公装简装水电丹东装修价格装饰与装修三四万简装装修图片香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声汪小菲曝离婚始末卫健委通报少年有偿捐血浆16次猝死单亲妈妈陷入热恋 14岁儿子报警雅江山火三名扑火人员牺牲系谣言手机成瘾是影响睡眠质量重要因素男子被猫抓伤后确诊“猫抓病”中国拥有亿元资产的家庭达13.3万户高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了男孩8年未见母亲被告知被遗忘张家界的山上“长”满了韩国人?倪萍分享减重40斤方法许家印被限制高消费网友洛杉矶偶遇贾玲何赛飞追着代拍打小米汽车超级工厂正式揭幕男子被流浪猫绊倒 投喂者赔24万沉迷短剧的人就像掉进了杀猪盘特朗普无法缴纳4.54亿美元罚金周杰伦一审败诉网易杨倩无缘巴黎奥运专访95后高颜值猪保姆德国打算提及普京时仅用姓名西双版纳热带植物园回应蜉蝣大爆发七年后宇文玥被薅头发捞上岸房客欠租失踪 房东直发愁“重生之我在北大当嫡校长”校方回应护栏损坏小学生课间坠楼当地回应沈阳致3死车祸车主疑毒驾事业单位女子向同事水杯投不明物质路边卖淀粉肠阿姨主动出示声明书黑马情侣提车了奥巴马现身唐宁街 黑色着装引猜测老人退休金被冒领16年 金额超20万张立群任西安交通大学校长王树国卸任西安交大校长 师生送别西藏招商引资投资者子女可当地高考胖东来员工每周单休无小长假兔狲“狲大娘”因病死亡外国人感慨凌晨的中国很安全恒大被罚41.75亿到底怎么缴考生莫言也上北大硕士复试名单了专家建议不必谈骨泥色变“开封王婆”爆火:促成四五十对测试车高速逃费 小米:已补缴天水麻辣烫把捣辣椒大爷累坏了

装修网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化