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

一文讲清什么是TypeScript装饰器以及如何使用TypeScript装饰器

TypeScript 装饰器是什么?

装饰器(Decorator)是TypeScript提供的一个高级语法,它类似于一种特殊类型的声明,可以附加到类声明,方法,访问符,属性或参数上。装饰器主要以函数的形式出现,运行在编译阶段,以实现对所修饰对象的行为的修改或增强。这是一个功能强大且在TypeScript编程中常用的特性。

TypeScript 装饰器有什么作用?

装饰器在 TypeScript 中的主要应用场景包括:

  1. 类装饰器: 可以观察、修改、或替换类定义。它在提供元编程能力方面特别有用,能够实现诸如依赖注入等高级概念。
  2. 方法装饰器: 可以监视、修改或者替换类的方法定义。这对于日志记录、性能监控、以及某些应用程序级别的业务逻辑(如记录操作者信息)有巨大的用处。
  3. 属性装饰器: 可以监视、修改或替换类的属性定义。比如实现类型检查,或者实现相关get/set方法等。
  4. 参数装饰器: 对类方法中的参数进行注解。
  5. 访问器装饰器: 用于装饰类的访问器,即类中的get与set方法。

如何使用 TypeScript 装饰器

装饰器的使用顺序是从外到内、由下至上。如果一个装饰器既可以应用到类上,也可以应用到类的方法、属性或参数上,那么对于这样的装饰器,它将首先应用到类上,然后是方法,接着是属性,最后是参数。

类装饰器的使用

通过定义一个包含正确签名的函数,你就能创建一个类装饰器。类装饰器的参数是构造函数。

// 定义装饰器
function LogClass(target: Function) {console.log(`New instance of ${target.name} class created.`);
}// 使用装饰器修饰类
@LogClass
class MyClass {constructor() {console.log("This is MyClass constructor");}
}

在上述代码中,**@LogClass便是一个装饰器,它在 MyClass**类被实例化的时候会执行,此时控制台会打印出相关日志。

方法装饰器的使用

方法装饰器用于监视、修改或替换类方法的定义。

// 定义装饰器
function LogMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {console.log(`Method ${propertyKey} of class ${target.constructor.name} is called.`);
}class MyClass {// 使用装饰器修饰方法@LogMethodmyMethod() {console.log("This is myMethod");}
}

方法装饰器**@LogMethod 的参数包括:目标类原型、方法名、以及描述符。在上述代码中,每次**myMethod`方法被调用的时候,都会打印出相关日志。

属性装饰器的使用

在Typescript中,属性装饰器可以接收两个参数:

  1. 目标类的原型(对于静态成员则为类的构造函数),
  2. 该属性的名称。

我们可以根据自己的需要来定制属性装饰器。来看以下例子:

function logProperty(target: Object, key: string | symbol): any {let value = target[key];// 属性值的 getterconst getter = function() {console.log(`Get: ${key} => ${value}`);return value;};// 属性值的 setterconst setter = function(newVal: any) {console.log(`Set: ${key} => ${newVal}`);value = newVal;};// 删除原始属性,替换为 getter 和 setterif (delete target[key]) {Object.defineProperty(target, key, {get: getter,set: setter,enumerable: true,configurable: true});}
}class MyClass {@logPropertypublic myProp: string;
}

在这段代码中,我们设计了一个属性装饰器 @logProperty,这个装饰器对于修饰的属性进行了监视,任何对属性的取值和赋值都将被打印出来。

参数装饰器的使用

参数装饰器是表示对类的构造函数,或者方法的参数进行装饰。参数装饰器会在运行时被调用,传入以下三个参数:

  1. 对于静态成员,是类的构造函数,对于实例成员,是类的原型对象。
  2. 成员的名字。(若装饰构造函数则为 undefined)
  3. 参数在函数参数列表中的索引。

请看以下示例:

function logParameter(target: Object, key: string | symbol, index: number) {console.log(`The decorator is applied to parameter: ${index} of method: ${key.toString()}`);
}class MyClass {myMethod(@logParameter name: string) {return name;}
}

在上述代码中,@logParameter就是一个参数装饰器,它会在参数被使用时被调用并打印参数的索引和所在方法名。

访问器装饰器的使用

访问器是类的一个特性,主要分为get访问器和set访问器。在Typescript中,我们可以使用装饰器去装饰访问器。访问器装饰器和方法装饰器使用方式类似,仍然是分别接收目标类、访问器名、和描述符三个参数。

function logAccessor(target: Object, key: string | symbol, descriptor: TypedPropertyDescriptor<any>) {const originalGet = descriptor.get;descriptor.get = function() {console.log(`Get: ${key.toString()} => ${originalGet.call(this)}`);return originalGet.call(this);};
}class MyClass {private _name: string;@logAccessorget name(): string {return this._name;}set name(name: string) {this._name = name;}
}

在这段代码中,@logAccessor就是一个访问器装饰器,除了原有的功能之外,还会在每次取值的时候打印出name的值。

TypeScript 项目开启装饰器

在 tsconfig.json 文件中,有一个叫 experimentalDecorators 的属性,你需要将其设置为 true,才能在 TypeScript 中启用装饰器。

{"compilerOptions": {"target": "es5","experimentalDecorators": true,"emitDecoratorMetadata": true}
}

在这个示例中:

  • "target": "es5" 表示输出的 JavaScript 代码符合 ES5 标准。
  • "experimentalDecorators": true 表示启用装饰器。
  • "emitDecoratorMetadata": true 表示额外生成装饰器的元数据,在某些情况下使用装饰器时,这是必须的。

总结

装饰器在 TypeScript 中的应用场景非常广泛,可以为我们提供强大的编程工具,如类装饰器、方法装饰器、属性装饰器、参数装饰器和访问器装饰器等,使得我们可以在编译阶段进行诸如日志记录、性能计算、参数验证等多种复杂的操作,使用这些装饰器,我们可以保持代码的整洁和解耦,使程序更易于理解和维护。

相关文章:

一文讲清什么是TypeScript装饰器以及如何使用TypeScript装饰器

TypeScript 装饰器是什么&#xff1f; 装饰器&#xff08;Decorator&#xff09;是TypeScript提供的一个高级语法&#xff0c;它类似于一种特殊类型的声明&#xff0c;可以附加到类声明&#xff0c;方法&#xff0c;访问符&#xff0c;属性或参数上。装饰器主要以函数的形式出…...

恶意软件样本行为分析——Process Monitor和Wireshark

1.1 实验名称 恶意软件样本行为分析 1.2 实验目的 1) 熟悉 Process Monitor 的使用 2) 熟悉抓包工具 Wireshark 的使用 3) VMware 的熟悉和使用 4) 灰鸽子木马的行为分析 1.3 实验步骤及内容 第一阶段&#xff1a;熟悉 Process Monitor 的使用 利用 Process …...

【XR806开发板试用】通过http请求从心知天气网获取天气预报信息

1. 开发环境搭建 本次评测开发环境搭建在windows11的WSL2的Ubuntu20.04中&#xff0c;关于windows安装WSL2可以参考文章: Windows下安装Linux(Ubuntu20.04)子系统&#xff08;WSL&#xff09; (1) 在WSL的Ubuntu20.04下安装必要的工具的. 安装git: sudo apt-get install git …...

NPM介绍与使用

什么是NPM&#xff1f; NPM&#xff08;Node Package Manager&#xff09;是一个强大的包管理工具&#xff0c;专门用于Node.js应用程序的依赖管理。它允许开发者轻松地分享、安装、更新和管理项目中使用的库、工具和框架。 NPM的安装 在使用NPM之前&#xff0c;请确保你的机…...

servlet +thymeleaf渲染引擎

servlet thymeleaf渲染引擎 一、maven坐标 <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.0.12.RELEASE</version> <!-- 使用适当的Thymeleaf版本 --> </dependency> &…...

10分钟了解nextTick,并实现简易版本的nextTick

在 Vue.js 中&#xff0c;有一个特殊的方法 nextTick&#xff0c;它在 DOM 更新后执行一段代码&#xff0c;起到等待 DOM 绘制完成的作用。本文会详细介绍 nextTick 的原理和使用方法&#xff0c;并实现一个简易版的 nextTick&#xff0c;加深对它的理解。 一. 什么是 nextTic…...

oracle表空间对象迁移到其他表空间

oracle数据库的磁盘空间满了&#xff0c;除了简单粗暴的增加磁盘空间外&#xff0c;还可以缩小表空间的datafile&#xff0c;因为正常业务运行中&#xff0c;表数据的删除和增加&#xff0c;会造成表空间里面里面有很多空的地方。方案有很多种&#xff0c;我这里简单介绍一下&a…...

<stdlib.h>头文件: C 语言常用标准库函数详解

文章目录 引言1. <stdlib.h> 概览1.1 头文件包含 2. 内存管理函数2.1 malloc 函数2.2 calloc 函数2.3 realloc 函数2.4 free 函数 3. 随机数生成函数3.1 rand 函数3.2 srand 函数 4. 字符串转换函数4.1 atoi 函数4.2 atof 函数4.3 itoa 函数4.4 ltoa 函数4.5 ultoa函数 5…...

Qt前端技术:3.QSS字体样式

small-caps就是让这个文本中的小写字母用大写的形式写出来并且在用大写的形式表达出来后他本身的大小会变小 有绝对尺寸和相对尺寸的区别 绝对尺寸一般是cm&#xff0c;英寸之类的 相对尺寸如px之类的是由显示器的屏幕分辨率来决定的 如windows用户分辨率一般是96像素点每英…...

阿里面试官:面试了一个能力相当不错的候选人,但背调时,他前同事和领导都说他人品很差,纠结该不该要他?...

* 你好&#xff0c;我是前端队长&#xff0c;在职场&#xff0c;玩副业&#xff0c;文末有福利! 在职场中&#xff0c;背调是个躲不开的事情。不管是各行各业背调可能都存在&#xff0c;只是形式不同而已。而且现在大环境不好&#xff0c;可能对个人的要求还更高一些。 背调的主…...

如何设计树形结构

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 前置知识&#xff1a;前…...

限量25台,川崎亮相Ninja ZX-10RR冬季限量款

最近川崎发布了自家ZX-10RR的超级限量版&#xff0c;官方称之为冬季测试版&#xff0c;之前也有一些车型推出过冬季测试版&#xff0c;通常是在年底推出&#xff0c;因为这个时候北半球都是非常寒冷的冬天。 不过这台ZX-10RR冬季测试版&#xff0c;并不仅仅只是限量那么简单&am…...

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制 前言0. 基础Qt/PyQt5介绍/关联Qt的优缺点&#xff08;为什么要用qt来做界面&#xff09;Qt 的核心机制请简要介绍一下Qt中的主窗口&#xff08;MainWindow&#xff09;类&#xff0c;它有哪些重要的函数和成员变量&#xff…...

SpringBoot 3 集成Hive 3

前提条件: 运行环境&#xff1a;Hadoop 3.* Hive 3.* MySQL 8 &#xff0c;如果还未安装相关环境&#xff0c;请参考&#xff1a;Hive 一文读懂 Centos7 安装Hadoop3 单机版本&#xff08;伪分布式版本&#xff09; SpringBoot 2 集成Hive 3 pom.xml <?xml ver…...

STL中优先队列的模拟实现与仿函数的介绍

文章目录 仿函数优先队列的模拟实现 仿函数 上回我们说到&#xff0c;优先队列的实现需要用到仿函数的特性 让我们再回到这里 这里我们发现他传入的用于比较的东西竟然是一个类模板&#xff0c;而不是我们所见到的函数 我们可以先创建一个类&#xff0c;用于比较大小 struc…...

LeetCode刷题--- 目标和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…...

【.NET Core】反射(Reflection)详解(二)

【.NET Core】反射&#xff08;Reflection&#xff09;详解&#xff08;二&#xff09; 文章目录 【.NET Core】反射&#xff08;Reflection&#xff09;详解&#xff08;二&#xff09;一、概述二、Type类2.1 Type对象表示哪些类型2.2 获取Type及其关联对象类型的方式2.3 Type…...

【错误记录/js】保存octet-stream为文件后数据错乱

目录 说在前面场景解决方式其他 说在前面 后端&#xff1a;go、gin浏览器&#xff1a;Microsoft Edge 120.0.2210.77 (正式版本) (64 位) 场景 前端通过点击按钮来下载一些文件&#xff0c;但是文件内容是一些非文件形式存储的二进制数据。 后端代码 r : gin.Default()r.Stat…...

sql_lab之sqli中的post注入

Post注入 用burpsuit抓包去做 Post第一关&#xff1a;&#xff08;gxa5&#xff09; 1.判断是否存在注入 username1or 11 #&password123&submit%E7%99%BB%E5%BD%95 有回显 username1or 12 #&password123&submit%E7%99%BB%E5%BD%95 没有回显 则证明存在sq…...

智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白冠鸡算法4.实验参数设定5.算法结果6.参考文…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...