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

【TS入门笔记4---装饰器】

TS入门笔记4

  • TypeScript---装饰器
  • 一、装饰器基础
      • 1. 定义与作用:装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问符、属性或参数上,用来修改类的行为。在 TypeScript 里,装饰器本质上是一个函数,它接收不同的参数并返回一个新的类、方法、属性等。要使用装饰器,需要在tsconfig.json里开启experimentalDecorators选项。
      • 2. 配置与启用
  • 二、装饰器分类
      • 1. 类装饰器:作用对象是类的构造函数。扩展类属性、替换类定义或添加元数据。
      • 2. 方法装饰器
      • 3. 属性装饰器
      • 4. 参数装饰器
  • 三、高级技巧
      • 1. 装饰器工厂:通过闭包传递参数,生成定制化装饰器
      • 3. 元编程与依赖注入
  • 四、总结:
      • 1.装饰器的执行顺序
      • 2.装饰器的应用场景

TypeScript—装饰器

一、装饰器基础

1. 定义与作用:装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问符、属性或参数上,用来修改类的行为。在 TypeScript 里,装饰器本质上是一个函数,它接收不同的参数并返回一个新的类、方法、属性等。要使用装饰器,需要在tsconfig.json里开启experimentalDecorators选项。

(1)本质:装饰器是一种特殊声明,通过 @expression 语法附加到类、方法、属性或参数上,用于动态扩展或修改代码行为,属于元编程技术。

(2)核心作用:
扩展功能:无需修改原始代码,动态添加日志、验证、缓存等功能。
元数据管理:标记依赖注入、路由路径等元信息

2. 配置与启用

实验性特性:需在 tsconfig.json 中启用 experimentalDecorators 选项:

{"compilerOptions": {"experimentalDecorators": true}
}

二、装饰器分类

1. 类装饰器:作用对象是类的构造函数。扩展类属性、替换类定义或添加元数据。

(1)禁止修改 Report 类的构造函数和原型

function Sealed(constructor: Function) {Object.seal(constructor);Object.seal(constructor.prototype);
}@Sealed
class Report {title: string;constructor(t: string) { this.title = t; }
}

2. 方法装饰器

参数:target(原型)、propertyKey(方法名)、descriptor(方法描述符)。
应用:添加日志、权限控制或缓存逻辑。
(1)缓存 fibonacci 方法结果以提升性能

function Cache(target: any, methodName: string, descriptor: PropertyDescriptor) {const originalMethod = descriptor.value;const cache = new Map();descriptor.value = function (...args: any[]) {const key = JSON.stringify(args);return cache.get(key) || (cache.set(key, originalMethod.apply(this, args)), cache.get(key);};
}class MathService {@Cachefibonacci(n: number): number { /* 计算逻辑 */ }
}

3. 属性装饰器

参数:target(原型)、propertyKey(属性名)。
应用:验证属性值或添加元数据。
(1)自动将 name 属性值转为大写

function Format(target: any, propertyKey: string) {let value = target[propertyKey];Object.defineProperty(target, propertyKey, {set: (newVal) => { value = newVal.toUpperCase(); },get: () => value});
}class User {@Formatname: string;
}

4. 参数装饰器

参数:target(原型)、methodName(方法名)、parameterIndex(参数位置)。
应用:记录参数信息或实现依赖注入。
(1)标记方法参数的元数据

function LogParameter(target: any, methodName: string, index: number) {console.log(`参数 ${index} 在方法 ${methodName} 中被标记`);
}class Service {getUser(@LogParameter id: string) { /* 逻辑 */ }
}

三、高级技巧

1. 装饰器工厂:通过闭包传递参数,生成定制化装饰器

(1)动态配置路由路径:

function Route(path: string) {return function (target: any, methodName: string, descriptor: PropertyDescriptor) {// 将路径与方法关联MetadataStorage.registerRoute(path, target.constructor, methodName);};
}class Controller {@Route('/users')getUsers() { /* 逻辑 */ }
}

(2)装饰器组合
执行顺序:
装饰器表达式:从上到下评估(工厂函数执行)。
装饰器函数:从下到上调用(装饰逻辑执行)。
输出顺序:Second 工厂 → First 工厂 → First 装饰器 → Second 装饰器

@First()
@Second()
class MyClass {}

3. 元编程与依赖注入

(1)依赖注入示例:框架自动注入 Database 实例

function Injectable(target: any) {// 注册到容器Container.register(target);
}@Injectable
class UserService {constructor(private db: Database) {}
}

四、总结:

1.装饰器的执行顺序

类装饰器最后执行。
方法和访问器装饰器优先于属性装饰器执行。
方法和访问器装饰器按照它们在代码中出现的顺序从下到上执行。
参数装饰器按照它们在参数列表中出现的顺序从左到右执行。

2.装饰器的应用场景

日志记录:如上述例子,在方法调用前后记录日志,方便调试和监控。
权限验证:可以在方法装饰器中实现权限验证逻辑,在调用方法前检查用户权限。

相关文章:

【TS入门笔记4---装饰器】

TS入门笔记4 TypeScript---装饰器一、装饰器基础1. 定义与作用:装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问符、属性或参数上,用来修改类的行为。在 TypeScript 里,装饰器本质上是一个函数,它接收不…...

大学之大:韩国科学技术研究院2025.4.28

韩国科学技术研究院(KAIST)作为韩国理工科教育与科研的旗舰机构,其发展历程深刻反映了韩国从工业化到科技强国的转型轨迹。以下从历史沿革、学科优势、教学特色、科研创新、教育规模、资源投入及未来战略等维度展开全面分析: 一、…...

【QT】QT控制硬件

QT控制硬件 1.上位机程序开发2.具体例子控制led灯3. linux中的函数跟QT类里面的函数同名,发生冲突4.示例代码 1.上位机程序开发 QT做一个上位机程序,控制底层的硬件设备(下位机) 总结: 在构造函数里面去初始化,打开硬件驱动在析…...

Spring的BeanFactory和FactoryBean的区别

​ ‌BeanFactory和FactoryBean在Spring框架中扮演着不同的角色,具有不同的功能和用途。‌ 定义与角色 ‌BeanFactory‌:BeanFactory是Spring IoC容器的核心接口,用于管理和维护Bean的定义、创建和生命周期。它是Spring IoC容器的基础&…...

【JavaScript】if语句

JS中的程序是从上到下一行一行执行的。 通过流程控制语句可以控制程序执行流程,使程序可以根据一定的条件来选择执行语句。 语句的分类: 1、条件判断语句 2、条件分支语句 3、循环语句 条件判断语句:使用条件判断语句可以在执行某个语句之前进…...

PostgreSQL oracle_fdw 扩展解析

PostgreSQL oracle_fdw 扩展解析 oracle_fdw 是 PostgreSQL 的一个外部数据包装器(Foreign Data Wrapper)扩展,允许 PostgreSQL 直接连接和操作 Oracle 数据库。以下是全面详细的使用指南: 一、安装与配置 1. 前置要求 Oracle 客户端库:必…...

从信息传输到智能互动,融云的全球智能通信云服务进化

4 月 24 日-25 日,GTC2025 全球流量大会在深圳福田会展中心举办,融云携全球智能通信云解决方案亮相。 在大会首日的开幕式峰会上,融云高级研发总监李宏博受邀分享《从信息传输到智能互动,融云的全球智能通信云服务进化》。 作为连…...

关于https请求丢字符串导致收到报文解密失败问题

加密方法:AES两次URLEncoder 问题现象:服务端收到的报文中少了类似%25这样的字符,导致解密失败 问题分析:用RequestBody接受 也有可能是springboot自动做了一次解码URLDecoder,自己只需要解码一次就好了...

Rust 学习笔记:修复所有权常见错误

Rust 学习笔记:修复所有权常见错误 Rust 学习笔记:修复所有权常见错误错误一:返回栈上的引用错误二:没有足够的权限错误三:别名和可变性错误四:从集合中拷贝一个元素(转移所有权)错误…...

Unity3D引擎框架及用户接口调用方式相关分析及汇总

分析目的 目前外网3D手游绝大部基于Unity3D引擎进行开发,Unity3D引擎属于商业引擎,引擎整理框架的运行机制较为神秘,本文介绍Unity引擎框架、对象组织方式、用户接口与引擎交互方式等原理,通过本文的分析和介绍可了解Unity3D框架中大致执行原理。 实现原理 Unity引擎作为…...

喷泉码在物联网场景下的案例分析

在物联网复杂场景下,无线传感器网络作为信息感知前端,面临能量受限、信道不稳定、多跳传输可靠性差等难题,严重制约物联网系统运行效能。传统基于反馈重传的通信机制在无线传感器网络中难以为继。其 ACK 确认操作频繁,大幅增加能耗,且在动态网络拓扑中,反馈易丢失,致使数…...

OpenCV 图形API(69)图像与通道拼接函数------将一个 GMat 类型的对象转换为另一个具有不同深度GMat对象函数convertTo()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个矩阵转换为另一种数据深度&#xff0c;并可选择进行缩放。 该方法将源像素值转换为目标数据深度。最终应用 saturate_cast<> 以避免…...

考研系列-计算机组成原理第七章、输入/输出系统

一、I/O接口 1.I/O接口概念 现在的I/O接口有些集成在南桥芯片上...

使用vue3 脚手架创建项目

1.创建项目 并 运行 1.1 创建项目 vue create abcd 1.2 运行 创建好项目后&#xff0c;命令行会提示你运行项目 npm run serve 2.介绍各个目录 node_modules : 项目依赖包&#xff0c;其中包括很多基础依赖&#xff0c;自己也可以根据需要安装其他依赖 assets文件夹&a…...

云服务器被黑客攻击应急响应与加固指南(上)

一、入侵检测与应急处理 1. 异常行为检测 # 查看异常登录记录 sudo lastb | awk {print $3} | sort | uniq -c | sort -nr sudo grep "Failed password" /var/log/auth.log | awk {print $11} | sort | uniq -c# 检查可疑进程 ps auxf | grep -E (curl|wget|bash|s…...

联合体union的特殊之处

一个联合体union的长度等于其内部长度最大的成员的长度。 union的所有成员共享同一块内存空间&#xff0c;可以利用这个特性读取数据的字节存储方式。 #include <stdio.h>int check_endian() {union {short s; // 2 字节&#xff08;short&#xff09;char c[2]…...

Spring系列五:手动实现Spring底层机制 第三部分

&#x1f497;实现任务阶段5 &#x1f35a;bean后置处理器实现 bean后置处理器实现 思路:先完成原生Spring 使用Bean后置处理器的案例, 然后实现自己的bean后置处理器 bean的生命周期~传送门 在idea中 shortcuts: shiftshift , 输入 InitializingBean, 搜索. 在zzw-spring…...

AGV、AMR机器人控制器x86/RK3588/NV各有什么优劣势?

以下是关于AGV/AMR机器人控制器解决方案中x86、RK&#xff08;瑞芯微&#xff09;、NV&#xff08;英伟达&#xff09;平台优劣势的综合分析&#xff1a; 一、核心性能对比 平台优势局限性适用场景‌x86‌1. 多核高频CPU支持复杂算法运算&#xff0c;适合大规模路径规划及多机…...

[ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec

[ACTF2020 新生赛]Include 因为前端过滤的太多了 所以直接使用 日志包含 搞 包含这个 /var/log/nginx/access.log [ACTF2020 新生赛]Include蚁剑连接 翻看 flag{1ce7a81e-0339-44ef-a398-a7784d3efe37} [ACTF2020 新生赛]Exec [ACTF2020 新生赛]Exec 127.0.0.1 |echo <?…...

23种设计模式 -- 工厂模式

Java 工厂模式示例代码 下面我将展示三种常见的工厂模式实现&#xff1a;简单工厂模式、工厂方法模式和抽象工厂模式。 1. 简单工厂模式 java // 产品接口 interface Shape {void draw(); }// 具体产品类 class Circle implements Shape {Overridepublic void draw() {System…...

【25软考网工】第四章(2)WLAN通信技术、WLAN频谱与信道

目录 一、WLAN通信技术 1. 扩展频谱通信 1&#xff09;扩频通信种类 2&#xff09;技术关系 2. 应用案例 1&#xff09;例题:扩频通信概念判定 2&#xff09;例题:跳频扩频技术描述 3&#xff09;例题:扩频通信技术标准 3.知识小结 二、WLAN频谱与信道 1. WLAN网络分…...

MetaEditor - 自动交易和技术指标编辑器

功能特点 代码编辑功能&#xff1a;支持多种编程语言&#xff0c;如 MQL4 和 MQL5&#xff0c;方便交易者根据自己的需求编写自动交易策略和技术指标。它提供了代码高亮、自动缩进、语法检查等功能&#xff0c;有助于提高代码编写的效率和准确性。调试与测试工具&#xff1a;配…...

关于华为云OneAccess登录认证过程介绍

这里主要介绍的是OAuth2认证的一个流程&#xff0c;分享一下实际开发过程中的实现逻辑 1、后端先根据接口文档的细节内容&#xff0c;然后拼接好url并且以String的类型返回给前端 2、此时前端会访问本连接&#xff0c;然后就会跳转到第三方页面&#xff0c;用户进行登录后&am…...

Spring - 简单实现一个 Spring 应用

一、为什么需要学习Spring框架&#xff1f; 1.企业级开发标配 超过60%的Java项目都使用Spring生态&#xff08;数据来源&#xff1a;JetBrains开发者报告&#xff09;。 2.简化复杂问题 通过IoC和DI&#xff0c;告别new关键字满天飞的代码。 3.职业竞争力 几乎所有Java岗…...

数据展示功能界面设计与实现及终端控制界面思路(17)

文章目录 一、本章说明二、传感数据展示功能实现2.1 实现目标2.2 具体实现2.2.1 需要在.pro 文件添加2.2.2 mainwindow.h 头文件2.2.3 mainwindow.cpp 文件2.2.4 实现界面展示三、项目源码文件四、终端节点控制五、Qt打包EXE一、本章说明 注:本节为【基于STM的环境监测系统(…...

opendds编译开发(c#封装)

opendds是对DDS协议的开源实现&#xff0c;具体可以查阅官网。 我使用的是源码编译开发&#xff0c;博文只针对windows平台。 环境准备 环境安装 1.visual studio 2022,我是企业版&#xff0c;安装需要选择c 2.Per下载安装,下载链接&#xff1a;https://strawberryperl.com…...

电子监管码预检剔除装置提示盒尺寸过短

问题&#xff1a;电子监管码预检剔除装置提示盒尺寸过短 现象&#xff1a;自动线监控程序报警提示“盒尺寸过短”。 原因&#xff1a;分盒设备拨盒的力度和距离、盒子在传送带的角度或传送带速度有所变化都会导致自动线出现“盒尺寸过短” 解决方法&#xff1a;根据传送带的速…...

【C++11特性】Lambda表达式(匿名函数)

一、函数对象 在C中&#xff0c;我们把所有能当作函数使用的对象当作函数对象。 一般来说&#xff0c;如果我们列出一个对象&#xff0c;而它的后面又跟有由花括号包裹的参数列表&#xff0c;就像fun(arg1, arg2, …)&#xff0c;这个对象就被称为函数对象。函数对象大致可分为…...

【北京】昌平区某附小v3700存储双控故障维修案例

2025年4月22日&#xff0c;接到一位通过网络找到我们的北京老师求助&#xff0c;反馈该学校一台V3700存储的磁盘分区无法正常读取了&#xff0c;老师在机房检查时发现存储后面2个控制器均亮警告灯。急需修复该设备读取里面资料用于周末运动会所需。于是在网上找到我们协助进行排…...

汤晓鸥:计算机视觉的开拓者与AI产业化的先行者

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 汤晓鸥&#xff1a;计算机视觉的开拓者与AI产业化的先行者 一、学术与创业之路 1. 从…...

MATLAB实现神经网络的OCR识别

使用说明&#xff1a; ‌运行要求‌&#xff1a; MATLAB R2020b 或更新版本已安装 Deep Learning Toolbox推荐使用GPU加速&#xff08;训练时在代码开头添加 gpuDevice(1)&#xff09; ‌代码特点‌&#xff1a; 使用MATLAB自带的MNIST手写数字数据集包含数据可视化、网络架构…...

车载软件架构 --- AUTOSAR的方法论

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

Java 的创新与变革之路:从 JDK 7 到 JDK 23

Java 作为一种广泛应用的编程语言&#xff0c;其发展历程与 JDK&#xff08;Java Development Kit&#xff09;的演进紧密相连。自 JDK 7 起&#xff0c;Java 语言不断引入重大特性&#xff0c;持续重塑开发格局&#xff0c;推动性能、功能和开发体验的提升。本文将深入剖析 JD…...

​LangChain、LlamaIndex、MCP、Spring AI、Ollama​ 和 ​DeepSeek​ 的定义、关系及典型架构设计

以下是 LangChain、LlamaIndex、MCP、Spring AI、Ollama 和 DeepSeek 的定义、关系及典型架构设计解析&#xff1a; 一、核心组件定义与功能 1. LangChain 定位&#xff1a;构建复杂 大语言模型&#xff08;LLM&#xff09;应用的通用框架。功能&#xff1a; 支持链式调用&am…...

Docker安装的mysql限制ip访问

1.问题背景 docker安装了mysql服务&#xff0c;服务器为Redhat9&#xff0c;我们希望通过防火墙规则直接限制访问的来源ip&#xff0c;只允许特定ip进行访问&#xff0c;其余ip需要被禁止。 2.排查过程 1.首先尝试了通过firewalld方式添加对应的防火墙规则&#xff0c; sud…...

怎么样才能在idea中写入spark程序

一、准备环境 1.安装Scala插件 专业版IDEA自带Scala插件&#xff0c;社区版需手动安装 确保插件版本与IDEA版本匹配 2.选择用哪个构建工具 sbt‌&#xff1a;适用于依赖管理简单、快速迭代的项目&#xff0c;需提前安装sbt工具24。 ‌Maven‌&#xff1a;适合熟悉Java生态…...

MySQL的数据类型

目录 数据类型分类 数值类型 tinyint bit ​编辑 小数(float) 小数(decimal) 字符串类型 char varchar 日期和时间类型 String类型 enum set find_ in_ set函数 我们今天来学习MySQL的数据分类。 数据类型分类 MySQL的字符型就是相当于字符串类型&#xff0c;所…...

Vue 中局部指令(directives)的用法详解

在 Vue.js 中&#xff0c;指令是一种特殊的属性&#xff0c;用于在 DOM 元素上绑定特殊行为。除了 Vue 内置的指令&#xff08;如v-model、v-if&#xff09;&#xff0c;还可以自定义指令来封装可复用的功能。 什么是局部指令&#xff1f; 局部指令是在单个组件中定义和使用的…...

mac 基于Docker安装minio服务器

在 macOS 上基于 Docker 安装 MinIO 是一个高效且灵活的方案&#xff0c;尤其适合本地开发或测试环境。以下是详细的安装与配置步骤&#xff0c;结合了最佳实践和常见问题的解决方案&#xff1a; 一、安装 Docker Desktop 下载安装包 访问 Docker 官网&#xff0c;下载适用于 …...

Redis常用数据结构解析:从原理到实战应用

作为一名开发者&#xff0c;我深知Redis在缓存、队列等场景中的重要性。但要用好Redis&#xff0c;必须对其核心数据结构有透彻理解。本文将结合我的实践经验&#xff0c;详细讲解Redis五种最常用的数据结构及其典型应用场景&#xff0c;帮助你在开发中游刃有余。 一、String&…...

Druid监控sql导致的内存溢出

问题 druid监控sql在网页端显示&#xff0c;我的服务插入sql比较大&#xff0c;druid把执行过的sql保存在DruidDataSource类的成员变量JdbcDataSourceStat dataSourceStat&#xff1b; JdbcDataSourceStat类中的LinkedHashMap<String, JdbcSqlStat> sqlStatMap中&#…...

基于Python镜像创建docker镜像时pip install一直出现NewConnectionError的一种解决办法

用dockerfile创建docker镜像&#xff0c;在pip的时候一直是出现错误&#xff1a; 13.21 WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HTTPSConn…...

【机器学习】朴素贝叶斯

目录 一、朴素贝叶斯的算法原理 1.1 定义 1.2 贝叶斯定理 1.3 条件独立性假设 二、朴素贝叶斯算法的几种常见类型 2.1 高斯朴素贝叶斯 (Gaussian Naive Bayes) 【训练阶段】 - 从数据中学习模型参数 【预测阶段】 - 对新样本 Xnew​ 进行分类 2. 2 多项式朴素贝叶斯 (…...

服务器硬件老化导致性能下降的排查与优化

随着企业数字化转型的深入&#xff0c;服务器作为IT基础设施的核心载体&#xff0c;其稳定性与性能直接影响业务连续性。然而&#xff0c;硬件老化导致的性能衰减问题普遍存在且易被忽视。本报告通过系统性分析服务器硬件老化现象&#xff0c;提出多维度排查方法与优化方案&…...

学习记录:DAY19

Docker 部署与项目需求分析 前言 人总是本能地恐惧未知&#xff0c;令生活陷入到经验主义的循环之中。但我们终将面对。今天的目标是把 Docker 部署学完&#xff0c;然后对项目进行需求分析。 日程 下午 4:30&#xff1a;Docker 部署项目部分学完了&#xff0c;做下笔记。晚…...

机器学习中的数据转换:关键步骤与最佳实践

机器学习中的数据转换&#xff1a;关键步骤与最佳实践 摘要 &#xff1a;在机器学习领域&#xff0c;数据是模型的核心&#xff0c;而数据的转换是构建高效、准确模型的关键步骤之一。本文深入探讨了机器学习中数据转换的重要性、常见的数据类型及其转换方法&#xff0c;以及在…...

【C++教程】三目运算符

C的三目运算符&#xff08;条件运算符&#xff09;是一种简洁的条件表达式工具&#xff0c;其形式为 条件 ? 表达式1 : 表达式2。以下是对其用法的详细总结&#xff1a; 1. 基本用法 条件判断&#xff1a;若条件为真&#xff0c;返回表达式1的值&#xff1b;否则返回表达式2…...

鼠标获取坐标 vs 相机获取坐标

Cesium鼠标点击获取坐标 vs 相机视角获取坐标 鼠标点击获取坐标流程图 #mermaid-svg-WwyCUbcFQekWG97C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WwyCUbcFQekWG97C .error-icon{fill:#552222;}#mermaid-svg-W…...

HarmonyOS SDK助力鸿蒙版今日水印相机,真实地址防护再升级

今日水印相机是一款真实记录"工作"和"生活"的水印拍照APP。作为专业的可信影像服务平台&#xff0c;今日水印相机依托时间、地点、身份三重数字水印技术&#xff0c;为企业和个人提供考勤打卡、外勤巡检、生活美好时刻记录等场景的可信存证服务。 面对虚拟…...

数组滑动窗口单调栈单调队列trick集【leetcode hot100 c++速查!!!】

文章目录 栈经典模版题-括号最小栈字符串解码每日温度柱状图的最大矩形 堆数组中的第k个最大元素前k个高频元素数据流中的中位数 数组最大子数组和合并区间轮转数组除自身以外数组的乘积 我们尝试将这三类问题放在一个专题中进行讨论&#xff0c;是因为它们有很多公共的部分。 …...