Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【TypeScript】TS进阶-装饰器(十一)

【TypeScript】TS进阶-装饰器(十一)

原创
作者头像
can4hou6joeng4
发布于 2023-11-28 06:33:35
发布于 2023-11-28 06:33:35
1.5K04
代码可运行
举报
运行总次数:4
代码可运行

装饰器

===

装饰器(Decorator)是一种特殊类型的声明,它能够被附加到类声明、方法、属性或参数上,装饰器的本身。其本身是一个函数,会在运行的时候被调用,被装饰的声明信息会作为参数传递给装饰器函数,当作形参。装饰器本质上主要是在操作原型对象,通过给原型对象 prototype添加一些方法和属性,来扩展类的功能。 装饰器主要分为类装饰器(接收1个参数)、属性装饰器(接收2个参数)、方法装饰器(接收3个参数、参数装饰器(接收3个参数),不同装饰器接收参数也不一同。另外TS内置了装饰器类型,我们直接用就好了。

装饰器分类

ts内置装饰器类型

接收参数

类装饰器

ClassDecorator

1个,类函数

方法装饰器

MethodDecorator

3个,类函数,方法名,成员属性描述符

属性装饰器

PropertyDecorator

2个,类函数、属性名称

参数装饰器

ParameterDecorator

3个,类函数,参数名,参数所在位置的索引

要想在 TypeScript 中使用装饰器,必须将 tsconfig.jsonexperimentalDecorators设置为true,具体如下所示:

  • 生成tsconfig.json文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tsc --init
  • 配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tsc --target ES5 --experimentalDecorators
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "compilerOptions": {
    "target": "ES5",
    "experimentalDecorators": true,                   /* Enable experimental support for TC39 stage 2 draft decorators. */
    "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */
    }
 }
  • 语法 @expressionexpression是一个函数,位置根据不同类型的装饰器要求放置。

1、类装饰器


(1)一个装饰器

类装饰器接收一个构造函数作为参数,参数的类型是一个函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function ClassDecorator(target: Function): void {
  target.prototype.start = function(): void {
      // 通用功能
      console.log('1')
  }
}
@ClassDecorator
class Course {
  constructor() {
      // 业务逻辑
  }
}
let course = new Course();
console.log('course',course.start())

(2)装饰器累加

装饰器不是只能定义一个,可以定义多个作用于一个类函数,通过装饰器累加从而给类追加多个方法和属性,可以用来监视、修改、替换类定义。

  • 参数:只有target一个,意思是类函数本身
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function StartTime(target: Function): void {
  target.prototype.start = function(): void {
      // 通用功能
      console.log('start')
  }
}
function EtartTime(target: Function): void {
  target.prototype.end = function(): void {
      // 通用功能
      console.log('end')
  }
}
@StartTime
@EndTime
class Course {
  constructor() {
      // 业务逻辑
  }
}
let course = new Course();
console.log('course',course.start())
console.log('course',course.end())

(3)装饰器传参

装饰器传参,那么怎么接受呢,参数如何放置,只需要在内部再返回一个装饰器就可,参数在外部进行接收,具体例子如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function ClassDecorator(name: string) {
  return (target: any)  => {
    target.prototype.name = name
  }
}
@ClassDecorator('zhangsan')
class Course {
  constructor() {
      // 业务逻辑
  }
}
let course:p = new Course();
interface p {
   name?:string
}
console.log('course',course.name)//zhangsan

2、方法装饰器


方法装饰器使用与类装饰器基本相同,方法装饰器需要放在类方法的前面,方法作为参数传给方法装饰器,接收三个参数,具体如下:

  • target: 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
  • propertyKey: 方法名称。
  • descriptor: 成员的属性描述符。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//PropertyDescriptor类型是ts内置的
function MethodsDecorator (target: Object, propertyKey: string, descriptor: PropertyDescriptor){
     console.log(target)
     console.log(propertyKey)
     console.log(descriptor)
}

class Person {
    name: string = ''
    age: number = 0

    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }

    @MethodsDecorator
    getName() {
      return this.name
    }

    @MethodsDecorator
    getAge() {
      return this.age
    }
}

const p = new Person('张三', 18)
p.getName() // getName:张三
p.getAge() // getAge:18
  • configurable:是否可删除
  • enumerable:是否可枚举
  • value:属性值
  • writable:是否可修改

3、属性装饰器


属性装饰器只接收两个参数,具体如下:

  • target: 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
  • propertyKey:属性名称
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const propertyName = (target: Object, propertyKey: string) => {
  console.log(target, propertyKey)
}

class Person {
    @propertyName 
    name: string = ''
    @propertyName
    age: number = 0

    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
}
const p = new Person('张三', 18)

注意:如果@propertyName 只写在name: string = ''上面,则只会打印出name相关的数据。

4、参数装饰器


参数装饰器用于装饰函数的参数,与方法装饰器一样接收三个参数,具体如下:

  • target:对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
  • propertyKey:属性名称。
  • paramIndex::参数所在位置的索引
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const paramDecorator = (target: any, propertyKey: string, paramIndex: number) => {
    console.log(target, propertyKey, paramIndex)
}

class Person {
    name: string = '';
    age: number = 0;
    
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }

    setName(age:number,@paramDecorator name: string) {
      this.name = name;
      this.age = age;
    }
}

const p = new Person('张三', 18) 
p.setName(1,'李四')

5、实际应用


(1)错误信息自定义

怎么使用装饰器进行错误信息自定义,这里使用方法装饰器来对传进来的函数进行处理,主要步骤如下:

  • 解构参数
  • 取到传进来的函数
  • 使用try...catch执行函数,新的报错定义在catch
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  const ErrorDecorator:MethodDecorator = (...args: any[]) => {

    const [,,descriptor] = args;
    const method = descriptor.value
    descriptor.value = () =>{
      try {
        method()
      } catch (error) {
        console.log('这是新定义的错误')
      }    
    }
  }

  class User {
    @ErrorDecorator
    public errorMsg () {
      throw new Error('报错了')
    }

  }
  new User().errorMsg()

在使用装饰器时先将原有的值进行存储一下,再去使用,以此来确保它使用的是类中的方法中的值。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TypeScript装饰器
TypeScript从入门到实践专栏是博主在学习和工作过程中的总结,实用性非常强,内容会不断进行精进,欢迎订阅哦,学会TS不迷路。
不叫猫先生
2023/11/15
3040
TypeScript装饰器
如何用 Decorator 装饰你的 Typescript?
正在着手写 THE LAST TIME 系列的 Typescript 篇,而Decorator 一直是我个人看来一个非常不错的切面方案。所谓的切面方案就是我们常说的切面编程 AOP。一种编程思想,简单直白的解释就是,一种在运行时,动态的将代码切入到类的指定方法、指定位置上的编程思想就是 AOP。AOP 和我们熟悉的 OOP 一样,只是一个编程范式,AOP 没有说什么规定要使用什么代码协议,必须要用什么方式去实现,这只是一个范式。而 Decorator 也就是AOP 的一种形式。
Nealyang
2019/12/30
1.3K0
typescript decorators 装饰器入门
装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上,可以修改类的行为。 装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被调用,被装饰的声明信息做为参数传入。
javascript.shop
2019/09/04
1.3K0
搭建node服务(四):Decorator装饰器
Decorator(装饰器)是ECMAScript中一种与class相关的语法,用于给对象在运行期间动态的增加功能。Node.js还不支持Decorator,可以使用Babel进行转换,也可以在TypeScript中使用Decorator。本示例则是基于TypeScript来介绍如何在node服务中使用Decorator。
宜信技术学院
2020/11/05
1.8K0
TS 从 0 到 1 - 装饰器
装饰器是一个表达式,表达式被执行后返回一个函数,函数的入参为 target、name、descriptor。执行函数后,可能返回 descriptor 对象,用于配置 target 对象。
Cellinlab
2023/05/17
2230
在TypeScript中使用装饰器
Decorator装饰器是ES7的时候提案的特性,目前处于Stage 3候选阶段(2022年10月)。
luciozhang
2023/04/22
1.4K0
在TypeScript中使用装饰器
TypeScript基础知识
在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范。 在程序设计里面,接口起到了一种限制和规范的作用。 接口定义了某一批类所需遵守的规范,接口不必关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类必须提供某些方法,提供这些方法的类就可以满足实际需要。ts中的接口类似java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等。
Clearlove
2021/03/04
7910
TypeScript系列教程十一《装饰器》 -- reflect-metadata
reflect-metadata 拆成两个单词,reflect 反射和 metadata,通俗理解 利用反射的原理修改元数据。
星宇大前端
2022/05/06
2.4K0
TypeScript系列教程十一《装饰器》 -- reflect-metadata
TypeScript装饰器从入门到应用
最近两年TypesScript简称“Ts”越来越火了,而且还在持续高涨。相信在不久后的将来,它将会成为我们日常开发中不可缺少的部分。我这么说是有依据的,因为在前端最火的框架中就已经有两个都更好的在支持使用Ts编写代码了,相信已经在使用中的朋友已经尝到香味了。
吴佳
2022/09/26
6090
NestJs:深入浅出装饰器
最近工作上刚好有接触部分 nest 相关的内容,之前对于 nest 了解的并不是特别深入。
19组清风
2023/10/31
4550
ts装饰器(注解)
官方文档:https://www.tslang.cn/docs/handbook/decorators.html
阿超
2022/08/21
1.9K0
ts装饰器(注解)
Typescript笔记
数值类型有很不止 number, bigint也是。同时值的话可以是十进制,二进制,还可以是NaN。
踏浪
2020/11/05
6200
TS 进阶 - 实际应用 03
装饰器的本质是一个函数,只不过它的入参时提前确定好的。TypeScript 中的装饰器目前只能在类及类成员上使用。
Cellinlab
2023/05/17
5520
【Angular专题】 (3)装饰器decorator,一块语法糖
修饰器是ES7加入的新特性,Angular中进行了大量使用,有很多内置的修饰器,后端的同学一般称之为“注解”。修饰器的作用,实际上就是设计模式中常说的装饰者模式的一种实现,早在ES6开始,设计模式原生化就已经是非常明显的趋势了,无论是for..of..和Iterator接口的配合内化了迭代者模式,Proxy对象实现的代理模式等等,都可以看出Javascript逐渐走向标准化的趋势和决心。
大史不说话
2018/12/28
1.4K0
TS 从 0 到 1 - TypeScript 中的各种符号
! 后缀表达式可以用于断言操作对象是非 null 和非 undefined 类型。即 x!,将从 x 值域中排除 null 和 undefined。
Cellinlab
2023/05/17
1.7K0
TypeScript 装饰器
类装饰器在类声明之前被声明(紧靠着类声明)。类装饰器应用于类构造函数,可以用来监视,修改或替换类定义。
程序猿的栖息地
2024/02/17
1930
TypeScript 装饰器
NestJS装饰器
最近用nestjs做了一个前后端的全栈项目,在nestjs中看到的装饰器无处不在,今天主要回顾下关于装饰器的那些事
Maic
2023/11/02
3240
NestJS装饰器
TypeScript 的装饰器有哪些?
JS 的装饰器还在提案中(提案了好久),还没进入正式标准,掌握半成品实在性价比不高。
前端西瓜哥
2022/12/21
4460
【愚公系列】2021年12月 Typescript-装饰器
装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为。 通俗的讲装饰器就是一个函数方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能, 可以认为就是在原有代码外层包装了一层处理逻辑。
愚公搬代码
2022/12/01
4430
2020的最后一天,不妨了解下装饰器
举一个非常常见的需求。假设我们有一个类Network,它有一个异步getList方法
ACK
2021/01/05
1.1K0
相关推荐
TypeScript装饰器
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验