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 外部…

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…

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

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

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;️&…

flink部署模式介绍

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

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

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

2024年轻人返乡创业潮,外卖平台市场需求是怎么样的?

目前&#xff0c;县域经济正面临着几大利好。“返乡就业、返乡创业和告老还乡”现象越发普遍&#xff0c;这不仅在小县城中有所体现&#xff0c;同样在乡镇中也呈现出同样的趋势。一些产业链和工厂纷纷下沉到乡镇&#xff0c;带来了更多的就业机会。这不仅能够吸引年轻人回乡就…

Spring Boot 4.0:构建云原生Java应用的前沿工具

目录 前言 Spring Boot简介 Spring Boot 的新特性 1. 支持JDK 17 2. 集成云原生组件 3. 响应式编程支持 4. 更强大的安全性 5. 更简化的配置 Spring Boot 的应用场景 1. 云原生应用开发 2. 响应式应用程序 3. 安全性要求高的应用 4. JDK 17的应用 总结 作…

CRM系统--盘点五大CRM客户管理系统

在当今市场经济中&#xff0c;销售工作的重要性日益凸显&#xff0c;有效的客户管理成为了提升销售业绩的关键因素。面对日新月异的市场环境和客户需求的多样化&#xff0c;销售人员通常会面临以下问题&#xff1a; 接到了新的销售任务&#xff0c;该如何选择和确定目标客户&am…

API协议设计的十种技术

文章目录 前言一、REST二、GraphQL三、gRPC&#xff08;google Remote Procedure Calls&#xff09;四、Webhooks五、服务端的事件发送——SSE&#xff08;Server-sent Events&#xff09;六、EDI&#xff08;Electronic Data Interchange&#xff09;七、面向API 的事件驱动设…

Visual Studio2022实用使用技巧集

前言 对于.NET开发者而言Visual Studio是我们日常工作中比较常用的开发工具&#xff0c;掌握一些Visual Studio实用的搜索、查找、替换技巧可以帮助我们大大提高工作效率从而避免996。 Visual Studio更多实用技巧 https://github.com/YSGStudyHards/DotNetGuide 代码和功能搜…

Verilog基础:强度建模与net型信号的多驱动问题(三)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 四、一般情况下的net型信号的线与组合&#xff08;线网多驱动&#xff09; 在Verilog基础&#xff1a;强度建模与net型信号的多驱动问题&#xff08;二&#xff0…

如何在Linux部署JumpServer堡垒机并实现远程访问本地服务

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

如何使用支付宝沙箱环境本地配置模拟支付并结合内网穿透远程调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff…