TypeScript: 类的装饰器(一)

【高频考点精讲】TypeScript装饰器原理剖析:从类装饰器到参数装饰器 🧑‍🏫:全栈老李📅:2025 年 7 月🧑‍💻:前端初学者、进阶开发者🚀:本文由全栈老李原创,转载请注明出处。最近在重构公司项目时,我发现很多同事对TypeScript装饰器的理解还停留在"知道有这么个东西"的阶段。这让我想起三年前自己第一次接触装饰器时,也是被各种符号绕得晕头转向。今天咱们就来彻底搞懂这个既强大又优雅的特性,看完保证你也能像老司机一样玩转装饰器。装饰器本质上就是个函数,它能在不修改原代码的情况下给类、方法或属性"加料"。 阅读详情

假设我有一个汽车工厂,每天都在生产汽车,他们都有统一的名字和价格,都可以在公路上开,那么,我们很容易写出如下代码:

PS: 如果没有搭建 TypeScript 的开发环境,请看这里

class Car {
  private name: string;
  private price: number;

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

  getName() {
    console.log(this.name);
  }

  getPrice() {
    console.log(this.price);
  }

  drive() {
    console.log("drive");
  }
}

const toyota: Car = new Car("toyota", 175000);
toyota.getName();
toyota.getPrice();
toyota.drive();

那么,当我需要为每一辆出厂的车都安装行车记录仪器时,那么,我们可能会修改为如下代码:

class Car {
  private name: string;
  private price: number;

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

  getName() {
    console.log(this.name);
  }

  getPrice() {
    console.log(this.price);
  }

  drive() {
    console.log("drive");
  }
  // 添加行车记录仪
  driveRecorder() {
    console.log("driveRecorder");
  }
}

const toyota: Car = new Car("toyota", 175000);
toyota.getName();
toyota.getPrice();
toyota.drive();
toyota.driveRecorder();

上面代码能正确执行,我们也为每辆出厂的车添加上了行车记录仪。那么,现实中行车记录仪一般都是,客户买了车后才会去安装的,也就是说,车辆在设计的时候不会考虑把一些非必要的配件都设计上,只会留出空间,让客户去安装。同理,从代码的角度 driveRecorder 这个方法不应改写进 Car 类里边,它不是在类本身的东西,是之后加上的,上面的代码显然破坏了类的设计,那么我们可以把 driveRecorder 添加到类的外面,也就是把它做成一个装饰器,装饰我们的类,那么我们的代码修改为如下:

function recorder(constructor: any) {
  constructor.prototype.driveRecorder = () => {
    console.log("driveRecorder");
  };
}

@recorder // @recorder 为类的装饰器
class Car {
  private name: string;
  private price: number;

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

  getName() {
    console.log(this.name);
  }

  getPrice() {
    console.log(this.price);
  }

  drive() {
    console.log("drive");
  }
}

const toyota: Car = new Car("toyota", 175000);
toyota.getName();
toyota.getPrice();
toyota.drive();
toyota.driveRecorder();

那么,如果您直接抄上面的代码,可能会得到如下两个报错提示:

1.装饰器语法报错

通过提示我们知道,TypeScript的装饰器在ES语法中属于一个实验性值的语法,故在VSCode中会报错,如果要使用装饰器
则需要把tsconfig.json的’experimentalDecorators’的注释打开才能解除警报,如下图

2.实例调用装饰器方法报错

关于这个错误,我们看下装饰器

function recorder(constructor: any) {
  constructor.prototype.driveRecorder = () => {
    console.log("driveRecorder");
  };
}

在 TypeScript 的类装饰器中,装饰器是一个函数,那么它的参数就是这个类,这里的 constructor 就是我们传入的 Car 类,我们用原型的方法把 driveRecorder 挂载到 constructor 而 constructor 的类型声明为 any,toyota 的类型为 Car,两个类型不一样,所以找不该 driveRecorder 方法报错,这里我们就临时改一下调用的方式(把 toyota 的类型临时改成any):

(toyota as any).driveRecorder();

那么报错没了,我们运行下代码,结果是对的

回过头来看装饰器和原来在类中的修改,执行的结果是一样的,但编程的思想却不一样,直接在类中修改看似很方便,也是我们最容易想到的一个方式,但这只是我们在最舒适的环境下想到的,有可能,这个类不是我们写,是别人写的,那么非常不推荐大家去修改别人的代码,这里推荐使用装饰器,直接在别人写好的类上面加上,不会破坏别人的代码
原文链接

TypeScript(八)装饰器 在TS中,装饰器是一种特殊类型的声明。可以附加到类、方法、属性或参数上用于修改类的行为或属性。在面向对象编程中,有时需要对类的行为和功能做出修改,直接修改类的内部可能会使成本升高,或出现其他问题;此时可以使用装饰器来修改类,在保证类内部结构与功能不变的前提下对数据或行为进行迭代TS中装饰器可以分为类装饰器、方法装饰器、属性装饰器和参数装饰器。 阅读详情

相关推荐

【TypeScript】深入学习TypeScript装饰器

本篇文章将深入去讲解TypeScript中的装饰器,这也许会是你看过的最全面最细致的TypeScript,关注博主学习TypeScript不迷路!!!

前端之行,任重道远! 7363

TypeScript中的装饰器

TypeScript中的装饰器是一种可以附加到类、方法、属性或参数上的特殊声明。装饰器提供了一种在编译时检测类型和运行时修改行为的机制,在许多框架中得到了广泛的应用。它们本质上是函数,可以接收一个或多个参数,并返回新的目标对象。装饰器是为元素(类、方法、属性、参数)添加注解的语法糖,提供了一种简洁优雅的方式来描述元素的特性。当我们在使用装饰器时,它实际上是在目标元素周围创建一个包装器函数,以便在目标元素被调用或使用时运行一些代码。

jieyucx的博客 5005

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

装饰器(Decorator)是一种特殊类型的声明,它能够被附加到类声明、方法、属性或参数上,装饰器的本身。其本身是一个函数,会在运行的时候被调用,被装饰的声明信息会作为参数传递给装饰器函数,当作形参。装饰器本质上主要是在操作原型对象,通过给原型对象 `prototype`添加一些方法和属性,来扩展类的功能。

编码世界 1万+

TypeScript详解五:装饰器

本文简单介绍了 TypeScript 装饰器的基本语法和使用方法。通过装饰器,我们可以大大提高代码的可读性和扩展性,减少冗余代码量,同时也实现了更好的代码复用。

to_the_Future的博客 3378

TypeScript装饰器深入实践:类与属性的应用

本文还有配套的精品资源,点击获取 简介:TypeScript装饰器是一种向类、属性、方法或参数添加元数据和行为的强大特性。本教程详尽阐述了装饰器的定义、类装饰器、属性装饰器以及装饰器工厂的实现和应用。通过实际代码示例,展示了如何使用装饰器来增强类的功能和属性的元数据,包括日志记录、属性访问监控等。学习装饰器不仅能够提升TypeScript代码的灵活性和维护性,还能帮助开发者...

weixin_29215509的博客 1226

北航机器学习2020-2021秋季学期期末试题回忆

北航机器学习2020-2021秋季学习期末试题回忆 fanjn, zhangyy, yuanq, wanggq, weixy, anh, wangyy, zhouxy, likc1 【注:考试使用纯白的A3答题纸,考试时间2h,各位同学可以自行模拟考试】 此试卷1-8题为10分,第9题为20分 1.2077年人类发射近地卫星,一共发射800颗,根据大小和轨道远近,有着不同的宜居条件(+表示宜居),有以下表格(数字八九不离十,其他属性什么的原题就是交替的) 数量 大小 轨道 是否宜居 30

weixin_45262065的博客 7610

Typescript:类的装饰器

装饰器为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式装饰器是一种特殊类型的声明,它能够被附加到或上。装饰器使用这种形式,expression求值后必须为一个,它会在运行时被调用,被装饰的声明信息做为参数传入。

前端御书房 736

Dynamics CRM证书更换

  Dynamics CRM产品一般有两种认证方式。第一种是基于声明的内部访问也就是无证书单纯用账号密码验证。第二种就是联合身份认证,需要安装网站证书。   对于联合身份认证的情况因为需要安装证书,而且证书是有一个一年的有效期,所以运维人员每年都需要进行证书更换的操作。以下就是更换证书的方法及过程。 证书根据申请方式一般也分两种,第一种是自建证书,这种证书是没有机构认证的所以安装上之后网站因为没...

bzpfly的博客 877

TypeScript:装饰器

随着TypeScript和ES6里引入了类,在一些场景下我们需要额外的特性来支持标注或修改类及其成员。 装饰器(Decorators)为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式。 注意: 装饰器是一项实验性特性,在未来的版本中可能会发生改变。

ChinaDragon10的博客 2524

中职网络安全2021年国赛Wireshark流量分析题目解析

中职网络安全Wireshark流量分析题目解析

FRANXX_02的博客 6443

高速串行信号仿真避坑指南:为什么你的SIwave Xnet设置了却不出结果?

本文深入解析SIwave中Xnet功能在高速串行信号仿真中的常见问题,包括模型缺失、网络不完整和端口设置错误等关键误区。通过详细的电路元件模型验证、网络完整性检查及端口配置指南,帮助工程师有效解决仿真不出结果的问题,提升信号完整性分析效率。

weixin_29218963的博客 252

typescript装饰器

在语法上,装饰器有如下几个特征。第一个字符(或者说前缀)是 ,后面是一个表达式 后面的表达式,必须是一个函数(或者执行后可以得到一个函数)。这个函数接受所修饰对象的一些相关值作为参数。这个函数要么不返回值,要么返回一个新对象取代所修饰的目标对象。装饰器有多种形式,基本上只要在 符号后面添加表达式都是可以的。下面都是合法的装饰器。 @myFunc @myFuncFactory(arg1, arg2) ​ @libraryModule.prop @someObj.method(123) ​ @(wrap(di

wubeidangziqiang的博客 2470

23数字图像置乱技术(matlab程序)

所谓“置乱”,就是将图像的信息次序打乱,a像素移动到b像素位置上,b像素移动到c像素位置上,……,使其变换成杂乱无章难以辨认的图片。数字图像置乱技术属于加密技术,是指发送发借助数学或者其他领域的技术,对一幅有意义的数字图像做变换,使之变成一幅杂乱无章的图像用于传输。在图像传输过程中,它通过对图像像素矩阵的重排,破坏了图像矩阵的相关性,使非法截获者无法从杂乱无章的图像中获得原图像信息,以此实现信息的加密。接收方经去乱解密可恢复原图像。

m0_57943157的博客 1206

【typescript】TS编写和使用装饰器之(一):类装饰器

随着TypeScript和ES6里引入了类,在一些场景下我们需要额外的特性来支持标注或修改类及其成员。 装饰器(Decorators)为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式。 Javascript里的装饰器目前处在 建议征集的第二阶段,但在TypeScript里已做为一项实验性特性予以支持。 注意  装饰器是一项实验性特性,在未来的版本中可能会发生改变。 若要启用实验性的装饰器特性,你必须在命令行或tsconfig.json里启用experimentalDecorators编译器选项:

qq_39576711的博客 1839

吉比特-笔试

1. 题一:打雷后下雨的概率是80%,而打闪电后下雨的概率是70%,那么即打雷又打闪电后下雨的概率是多少?   答:打雷后下雨和打闪电后下雨都是独立事件,P=1-又打雷又闪电但没下雨的概率= 1 - 0.2 *0.3 = 94%        题二:打雷后下雨的概率是80%,但是没打闪电后下雨的概率是20%,那么打雷了但没打闪电后下雨的概率是多少?答:P=0.8 *0.2 / ( 0.8 *0

naturism的专栏 2496

Linux环境下使用线程方式操作UART读写功能

本文介绍Linux环境下使用线程方式操作UART的方法,实现了串口打开,关闭,发送数据,接收数据功能,还编写测试代码,验证该功能。

mftang的博客 2079

TypeScript装饰器,一篇就够了

文章目录TypeScript装饰器 TypeScript装饰器

SuperBin的博客 1万+

某勾网之登录过程逆向

拉勾网的登录过程逆向,包含请求头(X-S-HEADER、X-K-HEADER、X-SS-REQ-HEADER等) 以及 请求参数/返回数据的加解密。

shanf7921的博客 3万+

TypeScript 装饰器

装饰器是 TypeScript 中一种特殊的语法特性,它本质上是一个函数,能够附加到类、类的方法或者类的属性上,用于对它们进行额外的修饰和扩展,在不改变原有类、方法或属性的基本定义和逻辑的基础上,添加一些额外的功能或改变其行为。类装饰器能够在类的定义层面进行操作,比如可以修改类的原型对象,从而为类添加新的方法或者属性,改变类实例化的行为等。通过装饰器的这些功能,能够在不大量修改原有类、方法和属性的基础上,灵活地为代码添加各种额外的逻辑和约束,提升代码的质量和可维护性,使其更加健壮和符合业务场景的需要。

2401_83367969的博客 1949

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【TypeScript】扩展:装饰器

(Parameter Decorators)是用来装饰类方法中的参数的装饰器。装饰器工厂不是装饰器,装饰器工厂的返回值是装饰器,装饰器工厂的作用主要是它接收的参数可以供给装饰器使用。答:静态属性是类本身的属性,而不是类的实例的属性。访问器装饰器的工作机制与普通方法装饰器相似,但它们专门作用于 getter 和 setter。先【从上到下】执行所有的装饰器工厂,再【从下到上】执行所有装饰器(包括装饰器工厂里的装饰器)装饰器,可以给实例添加一个属性,用于记录实例对象创建的时间,再添加方法读取时间。

2301_76769195的博客 1631

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TypeScript装饰器详解

TypeScript装饰器详解

嘻嘻哈哈的博客 2945

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

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

乐闻世界 3385

一文搞懂typescript的装饰器

装饰器是一种特殊类型的声明,它能够附加到类、类的函数、类属性、类函数的参数上,以达到修改类的行为 一、装饰器的种类 1、根据装饰器的位置 类装饰器 类函数装饰器 类属性装饰器 类函数参数装饰器 2、根据装饰器是否有参数 无参装饰器(一般装饰器) 有参装饰器(装饰器工厂) 二、类的装饰器 1、类装饰器的写法 function desc(target) { consol...

水痕 4771

TypeScript 装饰器:高级编程技巧

"TypeScript 装饰器:高级编程技巧" 是一篇深入探讨 TypeScript 中装饰器功能的文章。装饰器作为一种强大的语法结构,允许开发者在编译时修改类、方法、属性等的定义,从而实现代码的高阶抽象和复用。本文将带你领略装饰器的魔法,展示如何利用这一特性来增强代码的模块化和可维护性,是每个追求代码优雅的 TypeScript 开发者不容错过的指南。

知心宝贝的博客 1237

TypeScript 装饰器详解

20151⃣类装饰器2⃣属性装饰器3⃣方法装饰器4⃣访问器装饰器5⃣参数装饰器备注:虽然中可以直接使用**类装饰器**,但为了确保其他装饰器可用,现阶段使用时,仍建议使用配置来开启装饰器支持,而且不排除在来的版本中,官方会装饰器的相关语法!

涂涂 1711
上一篇: 快速搭建 TypeScript 开发环境
下一篇: TypeScript: 类的装饰器(二)
HTK217
博客等级 码龄9年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值