装饰器的设计和用法
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
参数说明同类方法装饰器
 

多层装饰器的执行顺序

 
类中不同声明上的装饰器将按以下规定的顺序应用:
  1. 参数装饰器,然后依次是方法装饰器访问符装饰器,或属性装饰器应用到每个实例成员。
  1. 参数装饰器,然后依次是方法装饰器访问符装饰器,或属性装饰器应用到每个静态成员。
  1. 参数装饰器应用到构造函数。
  1. 类装饰器应用到类。
如果在一个类中,同时使用装饰器修饰类和类的方法,那么装饰器的执行顺序是:先执行类方法的装饰器,再执行类装饰器。
 

多个装饰器组合的执行顺序

如果同一个方法有多个装饰器,会像剥洋葱一样,先从外到内进入,然后由内向外执行。
 
 

实际使用按理

参考 依赖注入: IoC 反转理解和简单实现
 
 

为什么装饰器不能用于函数?

装饰器只能用于类和类的方法,不能用于函数,因为存在函数提升。
 
 
 
参考:

© ittat 2016-2025