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

TypeScript 装饰器详解

目录

装饰器

介绍

基本语法

类装饰器

方法装饰器

属性装饰器

参数装饰器

组合装饰器

装饰器工厂

总结


装饰器

介绍

TypeScript 中的装饰器(decorators)是一种特殊类型的声明,可以附加到类声明,方法,属性或参数上,以修改其行为。装饰器在编译阶段被应用,通常用来增强或修改类的行为或属性。

基本语法

在 TypeScript 中,装饰器以 @decoratorName 的形式使用,放置在装饰目标(如类、方法、属性等)的前面。装饰器可以是一个函数,接收不同的参数,具体参数取决于装饰的位置。

类装饰器

类装饰器在类声明之前声明,用来监视、修改或替换类定义。类装饰器可以接收一个参数,这个参数是被装饰的类本身。例如:

function classDecorator(constructor: Function) {console.log('Class decorator called.');
}@classDecorator
class MyClass {// 输出:class implementation
}

上面的 classDecorator 函数就是一个类装饰器,它接收类的构造函数作为参数,并在类被定义时调用。类装饰器可以用来修改类的行为或元数据。

方法装饰器

方法装饰器用来监视、修改或替换方法定义。它接收三个参数:目标对象(对于静态成员是类的构造函数,对于实例成员是类的原型)、方法名和方法的属性描述符。例如:

function methodDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {console.log('Method decorator called.');
}class MyClass {@methodDecoratormyMethod() {// method implementation}
}

属性装饰器

属性装饰器用来监视、修改或替换类属性的定义。它接收两个参数:目标对象和属性名。例如:

function propertyDecorator(target: any, propertyKey: string) {console.log('Property decorator called.');
}class MyClass {@propertyDecoratormyProperty: string;
}

参数装饰器

参数装饰器应用于类构造函数或方法声明中的参数。它接收三个参数:目标对象、方法名或构造函数、参数在函数参数列表中的索引。例如:

function parameterDecorator(target: any, methodName: string, parameterIndex: number) {console.log('Parameter decorator called.');
}class MyClass {myMethod(@parameterDecorator param1: string, @parameterDecorator param2: number) {//方法实现}
}

组合装饰器

装饰器可以组合使用,多个装饰器的执行顺序是从下到上,从右到左。例如:

function decorator1(target: any) {console.log('Decorator1');
}function decorator2(target: any) {console.log('Decorator2');
}@decorator1
@decorator2
class MyClass {// class implementation
}
// 输出:
// Decorator2
// Decorator1

装饰器工厂

装饰器可以接收参数并返回一个函数,以供装饰器在运行时调用。这种情况下被称为装饰器工厂。例如:

function myDecoratorFactory(name: string) {return function (target: any) {console.log(`Decorator called with name: ${name}`);};
}@myDecoratorFactory('TestName')
class MyClass {// class implementation
}
// 输出:
// Decorator called with name: TestName

总结

装饰器是 TypeScript 中强大的功能之一,它允许我们在编译阶段静态地修改类的行为和属性。通过类装饰器、方法装饰器、属性装饰器和参数装饰器,我们可以实现各种复杂的逻辑和模式,使代码更具可读性和可维护性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 大模型是否潜在地进行多跳推理?
  • 51 for 循环与 while 循环
  • OpenShift 4 - 用 oc-mirror 为离线 OpenShift 集群的 Mirror Registry 同步容器镜像
  • 使用npm全局安装typescript
  • Java 并发编程:一文了解 synchronized 的使用
  • JMeter接口测试-5.JMeter高级使用
  • 大模型学习笔记 - InstructGPT中的微调与对齐
  • AI测试入门:认识RAG(检索增强生成)
  • pip‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • Unity 资源之 Break Items - Toon VFX破碎物品与卡通硬币动画分享
  • 码蹄集部分题目(2024OJ赛7.31-8.4;树状数组+并查集)
  • 8.3,8.4总结
  • 人像修复-图章仿制工具
  • 【zookeeper 第七篇章】集群搭建 本文章不具体展示搭建过程 后期会单独出一篇文章编写集群搭建
  • 基于Springboot的个人博客系统
  • 2019年如何成为全栈工程师?
  • CentOS7 安装JDK
  • ESLint简单操作
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • laravel5.5 视图共享数据
  • mysql 数据库四种事务隔离级别
  • MySQL主从复制读写分离及奇怪的问题
  • opencv python Meanshift 和 Camshift
  • win10下安装mysql5.7
  • 汉诺塔算法
  • 爬虫模拟登陆 SegmentFault
  • 七牛云假注销小指南
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 手写一个CommonJS打包工具(一)
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微服务入门【系列视频课程】
  • 与 ConTeXt MkIV 官方文档的接驳
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • raise 与 raise ... from 的区别
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​比特币大跌的 2 个原因
  • ‌移动管家手机智能控制汽车系统
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • (13):Silverlight 2 数据与通信之WebRequest
  • (23)Linux的软硬连接
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (pojstep1.3.1)1017(构造法模拟)
  • (zt)最盛行的警世狂言(爆笑)
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)计算机毕业设计高校学生选课系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十五)使用Nexus创建Maven私服
  • (一一四)第九章编程练习
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (轉)JSON.stringify 语法实例讲解
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET 8 跨平台高性能边缘采集网关
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes