100天精通鸿蒙从入门到跳槽——第11天:TypeScript 知识储备:装饰器

在这里插入图片描述


博主猫头虎的技术世界

🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能!

专栏链接

🔗 精选专栏

  • 《面试题大全》 — 面试准备的宝典!
  • 《IDEA开发秘籍》 — 提升你的IDEA技能!
  • 《100天精通Golang》 — Go语言学习之旅!
  • 《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!

100天精通鸿蒙OS(基础篇)

  • 🚀 100天精通鸿蒙从入门到跳槽——第11天:TypeScript 知识储备:装饰器
    • 📝 摘要
    • 🌟 一、引言
    • 📘 二、正文
      • ✨ 装饰器的基本语法
      • 🌈 常见的装饰器类型
      • 🛠️ 自定义装饰器
    • 📊 三、总结
    • 📚 四、参考资料

🚀 100天精通鸿蒙从入门到跳槽——第11天:TypeScript 知识储备:装饰器

在这里插入图片描述

📝 摘要

本文将深入探讨TypeScript中的装饰器(Decorators)概念和实践应用。装饰器是一种独特的语法,主要用于扩展类、方法、属性等的行为和元数据。本文将深入讲解装饰器的语法结构、常见的装饰器类型,并指导如何根据需要自定义装饰器。

🌟 一、引言

TypeScript作为JavaScript的强类型超集,不仅提供了优秀的类型检查机制,还引入了多种高级特性,其中包括装饰器。装饰器能够优雅地修改和增强类、方法和属性的功能,而且在AngularExpress等流行框架中得到了广泛应用。本文旨在帮助你全面掌握TypeScript装饰器的精髓,让你在项目开发中游刃有余。

📘 二、正文

✨ 装饰器的基本语法

TypeScript中,装饰器通过@符号标识,紧跟在被修饰的声明之前。

装饰器本质上是函数表达式,其返回值为一个函数

装饰器函数通常接收以下三个参数:

  • 目标对象
  • 成员名称
  • 成员属性描述符

例如,下面是一个装饰器的简单示例:

function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {console.log(`Calling ${propertyKey} method`);
}class MyClass {@logmyMethod() {console.log('Hello, World!');}
}const obj = new MyClass();
obj.myMethod(); // 输出:Calling myMethod method

这个示例中的log装饰器在目标方法被调用时打印日志,通过在myMethod方法前加上@log,成功实现了行为的修改。

🌈 常见的装饰器类型

TypeScript提供了多种装饰器类型,主要包括类装饰器、方法装饰器、属性装饰器和参数装饰器。

  1. 类装饰器:用于修改或增强类的功能。它接收类的构造函数作为参数。
  2. 方法装饰器:用于修改类的方法。它接收目标对象、方法名称和属性描述符。
  3. 属性装饰器:用于修改类的属性。它接收目标对象和属性名称。
  4. 参数装饰器:用于修改方法或构造函数的参数。它接收目标对象、方法名称和参数索引。

以下是这些装饰器的示例代码:

首先,我们定义一个类装饰器WithCheetah,这个装饰器将添加一个特定的属性到类中。接着,我们定义一个方法装饰器LogMethod,用于记录方法的调用。然后,我们创建一个属性装饰器ReadOnly,使属性变为只读。最后,我们定义一个参数装饰器Validate,用于校验方法参数。

// 类装饰器
function WithCheetah(constructor: Function) {constructor.prototype.cheetah = "猫头虎@阿珊和她的猫";
}// 方法装饰器
function LogMethod(target: any, propertyName: string, descriptor: PropertyDescriptor) {const method = descriptor.value;descriptor.value = function (...args: any[]) {console.log(`调用方法: ${propertyName}`);return method.apply(this, args);};
}// 属性装饰器
function ReadOnly(target: any, propertyName: string) {Object.defineProperty(target, propertyName, {writable: false});
}// 参数装饰器
function Validate(target: any, propertyName: string, index: number) {console.log(`校验参数: 方法 ${propertyName} 的第 ${index + 1} 个参数`);
}@WithCheetah
class MyClass {@ReadOnlycheetah: string;@LogMethodsayHello(@Validate name: string) {console.log(`Hello, ${name}!`);}
}const myClassInstance = new MyClass();
console.log(myClassInstance.cheetah); // 输出: 猫头虎@阿珊和她的猫
myClassInstance.sayHello("世界");      // 输出: 调用方法: sayHello 和 Hello, 世界!// 尝试修改只读属性将导致错误
// myClassInstance.cheetah = "新值";   // 这会导致运行时错误

在这个例子中:

  1. WithCheetah类装饰器给类添加了一个新的属性cheetah
  2. LogMethod方法装饰器在调用sayHello方法时记录日志。
  3. ReadOnly属性装饰器使得cheetah属性成为只读。
  4. Validate参数装饰器在sayHello方法的参数被调用时执行校验。

这个示例我们演示了如何在TypeScript中使用不同类型的装饰器来增强和修改类的行为。

🛠️ 自定义装饰器

除了使用内置装饰器,我们还可以根据具体需求自定义装饰器。

自定义装饰器通常是一个函数,用于接收装饰目标的参数,并返回一个函数。这样,我们可以实现更为复杂的装饰

逻辑,例如权限验证、性能监控等。

function log(message: string) {return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {console.log(`[${message}] Calling ${propertyKey} method`);};
}class MyClass {@log('Debug')myMethod() {console.log('Hello, World!');}
}const obj = new MyClass();
obj.myMethod(); // 输出:[Debug] Calling myMethod method

📊 三、总结

本文详细介绍了TypeScript中装饰器的核心概念、语法及应用。装饰器作为一种特殊的语法结构,能够在不改变原有代码结构的前提下,增强类及其成员的功能,提升代码的可维护性和扩展性。

📚 四、参考资料

  • TypeScript Handbook: Decorators
  • Decorators in TypeScript

希望这篇博客能够帮助你更好地理解并应用TypeScript中的装饰器,为你的鸿蒙开发之旅添砖加瓦!🚀🚀🚀

在这里插入图片描述

👉 更多信息:对《100天精通鸿蒙》专栏感兴趣吗?别忘了点击文末名片或者下方链接加入我们的学习群。我是猫头虎博主,期待与您的交流! 🦉💬
领域矩阵

🌐 猫头虎技术领域矩阵
深入探索各技术领域,发现知识的交汇点。了解更多,请访问:

  • 猫头虎技术矩阵
  • 新矩阵备用链接

🚀 技术栈推荐
JS, TS,ArkTS 等前端技术

💡 联系与版权声明

📩 联系方式

  • 微信: Libin9iOak
  • 公众号: 猫头虎技术团队

⚠️ 版权声明
本文为原创文章,版权归作者所有。未经许可,禁止转载。更多内容请联系作者猫头虎@阿珊和她的猫

点击下方名片,加入猫头虎技术社群矩阵。与我们一起在《100天精通鸿蒙》的旅程中,探索HarmonyOS的奥秘,共同成长。


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

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

相关文章

代码随想录 Leetcode150. 逆波兰表达式求值

题目&#xff1a; 代码(首刷看解析 2024年1月21日&#xff09;&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] &qu…

AP5191 降压恒流 双灯 12V5A 一切一LED车灯汽车大灯驱动方案

AP5191是一款PWM工作模式,高效率、外围简 单、内置功率MOS管&#xff0c;适用于4.5-150V输入的高 精度降压LED恒流驱动芯片。输出功率150W&#xff0c; 电流6A。 AP5191可实现线性调光和PWM调光&#xff0c;线性调 光脚有效电压范围0.55-2.6V. AP5191 工作频率可以通过RT 外部…

咱们的打造自己的赚钱机器之打造自己的特色网站系列连续博文开始发布了

打造自己的赚钱机器之打造自己的特色网站前言1 咱们从今天开始正式连载咱们的打造个人特色网站系列博文. 整个博文实际上就是一本书,只是还未写出来.我就先以博文的形式发布,最后整理修改,再编撰成册. 那么,<<打造自己的特色网站>>系列博文为什么值得一看,又有哪…

win 下使用 cmd 运行 jar 包

1、使用 Win R 输入 cmd 命令打开命令提示符 2、在 cmd 窗口中输入以下命令 java -jar xxxxxx.jar 运行 jar 包&#xff0c;控制台出现中文乱码 原因是 windows 默认使用 GBK 编码格式&#xff0c;程序使用 UTF-8 编码格式 将编码格式改为 UTF-8 编码&#xff0c;在 cmd 窗…

JavaScript库jquery的使用方法

"写更少&#xff0c;做更多"是jquery的设计理念&#xff0c;jquery是一个兼容多浏览器的JavaScript库&#xff0c;利用jquery的语法设计能使开发更便捷。 网页添加jquery的方法:1.从jquery.com下载库&#xff1b;2.从CDN中载入库&#xff08;示例使用&#xff09;&a…

pytorch模型转caffe模型

记录一个好用的pytorch模型转caffe模型的方法&#xff0c;源码链接如下&#xff1a; https://github.com/xxradon/PytorchToCaffe 把代码clone下来后&#xff0c;进入example目录便可查看示例&#xff0c; cd example python resnet_pytorch_2_caffe.py import sys sys.pat…

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理课程汇总 第0章 绪论第一章 数字图像基础第二章 数字图像存储与处理第三章 空间域处理方法第四章 变换域处理方法第五章 辐射校正第六章 几何校正第七章 图像去噪声第八章 图像增强第九章 感兴趣目标及对象提取第十章 特征提取与选择第十一章 遥感数字图像分类…

【ASP.NET Core 基础知识】--路由和请求处理--路由概念(二)

一、路由参数传递方式 1.1 查询字符串参数 在路由中&#xff0c;查询字符串参数是一种常见的方式传递信息。这种方式通过URL中的查询字符串&#xff08;?key1value1&key2value2&#xff09;将参数附加到请求中。在ASP.NET Core中&#xff0c;可以通过以下方式在控制器动…

c++学习之IO流

目录 前言&#xff1a; 一&#xff0c;流的概念 二&#xff0c;c的io流 输入输出流 缓冲区的同步 文件流 文件的打开 文件读写自定义类型数据 字符流 1. 将数值类型数据格式化为字符串 2. 字符串拼接 3. 序列化和反序列化结构数据 前言&#xff1a; 在了解c的输入输…

SpringBoot异常处理和单元测试

学习目标 Spring Boot 异常处理Spring Boot 单元测试 1.SpringBoot异常处理 1.1.自定义错误页面 SpringBoot默认的处理异常的机制&#xff1a;SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot…

c语言->学会offsetof宏计算结构体相对偏移量

前言 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目的&#xff0c;学习offsetof宏计算结构体相对偏移量 1.offsetof宏 来我们看图…

vector讲解

在学习玩string后我们开始学习vector&#xff0c;本篇博客将对vector进行简单的介绍&#xff0c;还会对vector一些常用的函数进行讲解 vector的介绍 实际上vector就是一个数组的数据结构&#xff0c;但是vector是由C编写而成的&#xff0c;他和数组也有本质上的区别&#xff…

2.机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

2️⃣机器学习-K最近邻&#xff08;k-Nearest Neighbor&#xff0c;KNN&#xff09;分类算法原理讲解 个人简介一算法概述二算法思想2.1 KNN的优缺点 三实例演示3.1电影分类3.2使用KNN算法预测 鸢(yuan)尾花 的种类3.3 预测年收入是否大于50K美元 个人简介 &#x1f3d8;️&…

android 导航app 稳定性问题总结

一 重写全局异常处理&#xff1a; 1 是过滤掉一些已知的无法处理的 问题&#xff0c;比如TimeoutException 这种无法根除只能缓解的问题可以直接catch掉 2 是 一些无法继续的问题可以直接杀死重启&#xff0c;一些影响不是很大的&#xff0c;可以局部还原 比如&#xff1a; p…

题记(23)--整除问题

目录 一、题目内容 二、输入描述 三、输出描述 四、输入输出示例 五、完整C语言代码 一、题目内容 给定n&#xff0c;a求最大的k&#xff0c;使n&#xff01;可以被a^k整除但不能被a^(k1)整除。 二、输入描述 两个整数n(2<n<1000)&#xff0c;a(2<a<1000) 三、…

实时流媒体传输开源库——Live555

Live555&#xff08;LiveMedia Libraries&#xff09;是一个开源的多媒体流处理库&#xff0c;主要用于实现基于标准网络协议的实时流媒体传输。Live555提供了一套 C 类库&#xff0c;可以用于开发支持 RTP/RTCP、RTSP、SIP 等协议的流媒体服务器和客户端应用程序。它广泛用于视…

flink部署模式介绍

在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff0c;它们的区别主要在于&#xff1a; 集群的生命周期以及资源的分配方式&#xff1b;应用的 main 方法到…

XXL-Job的搭建接入Springboot项目(详细)

一、XXL-Job介绍 XXL-Job 是一款开源的分布式任务调度平台&#xff0c;由 Xuxueli&#xff08;徐雪里&#xff09;开发。它基于 Java 技术栈&#xff0c;提供了一套简单易用、高可靠性的任务调度解决方案。 XXL-Job 的主要作用是帮助开发者实现定时任务的调度和执行。它可以用…

OpenCvSharp 通道拆分、空间转换

通道拆分、空间转换 通道拆分 //通道拆分&#xff08;BGR&#xff09; Mat[] BGR Cv2.Split(src); //通道合并 Mat dst new Mat(); Cv2.Merge(BGR, dst);空间转换 //BGR转灰度图 Mat dst new Mat(); Cv2.CvtColor(src, dst , ColorConversionCodes.BGR2GRAY); Cv2.ImShow…

MySQL 深度分页

文章目录 一、深度分页二、测试数据三、分页策略3.1 默认分页3.2 索引分页3.3 子查询3.4 延迟关联 一、深度分页 MySQL 深度分页是指在分页查询数据量比较大的表时&#xff0c;需要访问表中的某一段数据&#xff0c;而这段数据的位置非常靠后&#xff0c;需要通过较大的 offse…