Typescript:类的装饰器

装饰器

装饰器为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式

装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上。

装饰器使用 @expression这种形式,expression求值后必须为一个函数,它会在运行时被调用,被装饰的声明信息做为参数传入

function setProp(){return function target(){}
}
@setProp()

装饰器求值

类中的装饰器的引用,参数装饰器、方法装饰器、访问符装饰器或者属性装饰器,应用到实例成员上

参数装饰器、方法装饰器、访问符装饰器、属性装饰器,应用到静态成员上

参数装饰器应用到构造函数上

类装饰器 应用到类上

类装饰器

类装饰器在类声明前声明,类修饰符应用于类的构造函数,可用于观察、修改或替换类定义。

类装饰器接收装饰类的构造函数作为唯一参数

如果类装饰器返回一个值,它将用提供的构造函数替换类声明。

function setName(name: string) {return (target: new () => any) => {sign = target;}}@setName('lison')class ClassDes {constructor() {}}

方法装饰器

方法修饰符在方法声明之前声明。修饰符应用于方法的属性描述符,可用于观察、修改或替换方法定义。

方法装饰器接收三个参数:

  1. 静态成员的类的构造函数或实例成员的类的原型
  2. 成员名称
  3. 成员的属性描述符

如果方法装饰器返回一个值,它将用作该方法的属性描述符。

function methodDecorator(target, propertyName,propertyDescriptor){}
class Person {name:string;constructor(name:string){this.name = name;}@methodDecoratorgetName(){return this.name;}
}

访问者装饰器

在访问器声明之前声明。访问器修饰符应用于访问器的属性描述符,可用于观察、修改或替换访问器的定义。

访问者装饰器接收三个参数:

  1. 静态成员的类的构造函数或实例成员的类的原型
  2. 成员的名称
  3. 成员的属性描述符

如果访问者装饰器返回一个值,它将用作成员得属性描述符

function getterDecorator(target, propertyName,propertyDescriptor){}
class Person {constructor(name:string){this.name = name;}@getterDecoratorget name(){return this.name;}
}

属性装饰器

在属性声明之前声明。
属性装饰器接收两个参数:

  1. 静态成员的类的构造函数或实例成员的类原型。
  2. 成员的名称

属性装饰器的返回值会被忽略。

function getterDecorator(target, propertyName,){}
class Person {@propertyDecoratorname:stringconstructor(name:string){this.name = name;}
}

参数装饰器

在参数声明之前声明了参数装饰器。参数修饰符应用于类构造函数或方法声明的函数。

参数装饰器接收三个参数:

  1. 静态成员的类的构造函数或实例成员的类原型
  2. 成员的名称
  3. 函数参数列表中参数的序号索引

参数装饰器的返回值会被忽略。

function paramsDecorator(target, propertyName,index){}
class Person {name:stringconstructor(name:string){this.name = name;}eat(@paramsDecorator food:string){}
}

装饰器的执行顺序

  1. 执行参数装饰器
  2. 执行方法和属性装饰器
  3. 执行类装饰器
    总的规律从内向外执行,先执行里面的装饰器,一次向外执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ACM】—蓝桥杯大一暑期集训Day5

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前正在学习C/C、Java、算法等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&#xff…

Qt6 Qt Quick UI原型学习QML第五篇

文章目录 效果QML语法父文件 MyQML.qmlQML语法子文件 TLineEditV1.qmlQML语法子文件 TTextEdit.qml 效果 QML语法父文件 MyQML.qml import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12Window {id: windowvisible: truewidth: 600height: 600title:…

Linux系统进程概念详解

这里写目录标题 冯诺依曼体系结构操作系统(Operator System)1.概念2.目的3.管理4.系统调用和库函数概念 进程1.概念2.描述进程-PCB3.查看进程4.通过系统调用获取进程标示符5.通过系统调用创建进程-fork 进程状态1.Linux内核源代码2.进程状态查看 进程优先级1.基本概念2.查看系统…

投个 3D 冰壶,上班玩一玩

本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟。 Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎,它使用 JavaScript 语言编写,并且基于 OimoPhysics 引擎进行了改进和优化。Oimo.js 核心库只有 150K ,专门用…

交易流水指标统计——pandas

1、根据交易流水,计算每个交易交易对象的如下指标, 总收入笔数、总收入月数、最大月收入笔数、最大月收入笔数所在日期(年月日格式) import pandas as pd path r"C:\Users\xxx\Desktop\科技数据.xlsx"df pd.read_exc…

5G的发展过程

目录 1.什么是5G 2.5G与4G的区别 3.5G的应用领域 4.5G给人类带来的福利 5.5G未来的发展趋势 1.什么是5G 5G技术是第五代移动通信技术,它是对之前的2G、3G和4G技术的升级和革新。5G技术具有更高的数据传输速度、更低的延迟和更大的网络容量,为人们提供…

Java-API简析_java.net.InetSocketAddress类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131870760 出自【进步*于辰的博客】 因为我发现目前,我对Java-API的学习意识比较薄弱…

GAMES104复习总结,课堂提炼(一)

主要是给自己看的,Games104课程很全面,王希老师学识广播,课程组也很认真努力。但是在文字版里面有大量的示例,比如可能会为了引入话题讲个故事等等。。。对于上课来说引人入胜,对于要找工作的我来说,每次看…

办公软件ppt的制作

毕业找工作太难了,赶紧多学点什么东西吧,今天开始办公软件ppt的制作学习。 本文以WPS作为默认办公软件,问为什么不是PowerPoint,问就是没钱买不起,绝对不是不会破解的原因。 一.认识软件 在快捷工具栏中顾名思义就是一…

微服务基础理论

微服务简介 微服务Microservices之父,马丁.福勒,对微服务大概的概述如下: 就目前而言,对于微服务业界并没有一个统一的、标准的定义(While there is no precise definition of this architectural style ) 。但通在其…

Express 框架的基本操作

目录 1、应用生成器 2、基本路由 2.1、在跟路由下配置 GET请求,返回对应相应内容。 2.2、在跟路由下配置 POST请求,返回对应相应内容。 2.3、在跟路由下配置 PUT请求,返回对应相应内容。 2.4、在根路由下配置DELETE请求,返回对…

音视频开发-ffmpeg介绍-系列一

目录 一.简介 FFmpeg框架的基本组成包含: 二. FFmpeg框架梳理音视频的流程​编辑 基本概念: 三.ffmpeg、ffplay、ffprobe区别 4.1 ffmpeg是用于转码的应用程序 4.2 fffplay是用于播放的应用程序 4.3 ffprobe是用于查看文件格式的应用程序 4.4 ffmpeg是用于转…

华为鲲鹏920 aarch64 版本 Ambari HDP 下载地址

声明:为有效缓解各位同行兄弟们的痛,特推出此文 本文能够适配兼容 华为鲲鹏920 aarch64 版本,仅限 CentOS7、openEuler20.03-LTS 操作系统 以下是详细下载地址 1、CentOS7 aarch64版本 CentOS7 aarch64 https://mirrors.huaweicloud.com/…

Langchain 的 Conversation summary memory

Langchain 的 Conversation summary memory 现在让我们看一下使用稍微复杂的内存类型 - ConversationSummaryMemory 。这种类型的记忆会随着时间的推移创建对话的摘要。这对于随着时间的推移压缩对话中的信息非常有用。对话摘要内存对发生的对话进行总结,并将当前摘…

91、RabbitMQ事务消息

RabbitMQ事务消息 通过对信道的设置实现 channel.txSelect(); 通知服务器开启事务模式;服务端会返回Tx.Select-ok channel.basicPublish; 发送消息,可以是多条,可以是消费消息提交ack channel.txCommit() 提交事务 channel.txRollback() 回滚事务 …

《零基础入门学习Python》第054讲:论一只爬虫的自我修养2:实战

0. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式! 今天我们决定在实战中来进行学习,会举两个例子,第一个例子是我们会下载一只猫,第二个例子是我们用Python来模拟浏览器通过在线的…

MySQL8.0索引新特性

文章目录 1 支持降序索引2 隐藏索引 1 支持降序索引 举例:分别在MySQL 5.7版本和MySQL 8.0版本中创建数据表ts1,结果如下: CREATE TABLE ts1(a int,b int,index idx_a_b(a,b desc) );在MySQL 5.7版本中查看数据表ts1的结构,从结…

83、讲下Zookeeper watch机制

讲下Zookeeper watch机制 客户端,可以通过在znode上设置watch,实现实时监听znode的变化。 Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端 父节点的创建&…

45:ECMAScript 6 简介

ECMAScript 6 简介 [ECMAScript 和 JavaScript 的关系](https://es6.ruanyifeng.com/#docs/intro#ECMAScript 和 JavaScript 的关系)[ES6 与 ECMAScript 2015 的关系](https://es6.ruanyifeng.com/#docs/intro#ES6 与 ECMAScript 2015 的关系)语法提案的批准流程[ECMAScript 的…

选择前端框架重要依据是什么?

状态更改检测,也就是检测应用程序对状态值的改变,这样才会相应地更新 UI。 (#MVC模式中模型Model的改变会更新View界面UI,这点类似后端的ORM,对象状态更改通过ORM框架自动变更相应数据表值) 变更检测是前…