
装饰器的设计和用法
type
status
date
slug
summary
tags
category
icon
password
装饰器介绍
TypeScript 项目开启装饰器
- "target": "es5" 表示输出的 JavaScript 代码符合 ES5 标准。
- "experimentalDecorators": true 表示启用装饰器。
- "emitDecoratorMetadata": true 表示额外生成装饰器的元数据,在某些情况下使用装饰器时,这是必须的。
装饰器的分类
按照装饰器的写法划分
- 普通装饰器 (无法传参)
- 装饰器工厂 (可以传承)
实际上是普通装饰器写法的柯里化处理
安装装饰器的放置方法划分
- 类装饰器
传入一个属性:constructor 构造函数
意味着可以改变类的构造器
- 属性装饰器
传入两个参数: target、 method
target :对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
method: 属性名称
为什么它没有descriptor? 因为这与TypeScript是如何初始化属性装饰器的有关
- 方法装饰器
传入三个参数: target、 method、descriptor
target - 存在两种情况
- 装饰器修饰的类方法是静态方法:target 为类的构造函数
- 装饰器修饰的类方法是实例方法:target 为类的原型对象
method - 方法名称 string
descriptor - 方法的属性描述
注意 如果代码输出目标版本小于
ES5
,属性描述符将会是undefined
。
- 方法的参数装饰器
传入3个参数:target, propertyKey, parameterIndex
target: 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
propertyKey: 这是参数的名称 可以是 string | symbol
parameterIndex: 参数的位置索引值
- 访问器装饰器 (get 方法)
传入三个参数: target、 method、descriptor
参数说明同类方法装饰器
多层装饰器的执行顺序
类中不同声明上的装饰器将按以下规定的顺序应用:
- 参数装饰器,然后依次是方法装饰器,访问符装饰器,或属性装饰器应用到每个实例成员。
- 参数装饰器,然后依次是方法装饰器,访问符装饰器,或属性装饰器应用到每个静态成员。
- 参数装饰器应用到构造函数。
- 类装饰器应用到类。
如果在一个类中,同时使用装饰器修饰类和类的方法,那么装饰器的执行顺序是:先执行类方法的装饰器,再执行类装饰器。
多个装饰器组合的执行顺序
如果同一个方法有多个装饰器,会像剥洋葱一样,先从外到内进入,然后由内向外执行。
实际使用按理
参考 依赖注入: IoC 反转理解和简单实现
为什么装饰器不能用于函数?
装饰器只能用于类和类的方法,不能用于函数,因为存在函数提升。
参考:
‣