项目升级必备!TS装饰器:简化代码、增加功能的利器 | TypeScript入门指南07

news2024/9/27 7:17:00

嘿,朋友!听说过TS里的装饰器没?就像给代码加了个‘魔法贴’,轻轻一点,功能升级,结构清晰。这篇文章,咱们聊聊这背后的魔法是怎么一回事!

 ts 入门指南系列

  1.  Ts vs Js 谁适合前端开发? | TypeScript 入门指南 01
  2. 详解 tsconfig.json配置文件 | TypeScript 入门指南 02
  3. 必学!TypeScript语法类型基础 | TypeScript 入门指南 03
  4. 终于搞懂TS中的泛型啦! | typescript 入门指南 04-
  5. interface 原来是这样用的呀 ?typescript入门指南05
  6. 一文搞懂 TS中 函数、枚举、别名 | TypeScript 入门指南 06

装饰器语法

装饰器是 TypeScript(简称 TS)中的一个特性,它可以在不修改 原始代码的情况下,通过添加额外的功能来改进代码。装饰器通常以@符号紧跟着一个函数或者类来表示。装饰器可以用于函数、类、属性和方法。

类装饰器

类装饰器用于修饰类,可以添加额外的行为或者修改类的行为。它可以用于在类声明之前对类进行拦截、修改或者扩展,对类进行修饰。类装饰器的使用场景很多,比如日志记录、性能分析、权限控制等。举个例子,想象一个社交平台的用户类,可以使用类装饰器添加检查用户是否在线的功能:

function checkOnline(target: any) {
  return class extends target {
    isOnline() {
      // 检查用户是否在线的逻辑
    }
  };
}

@checkOnline
class User {
  // 用户类的定义
}

属性装饰器

属性装饰器用于修饰类的属性,可以在属性声明之前对属性进行拦截、修改或者扩展。它可以在访问属性时执行特定的操作,比如验证输入、计算属性等。一个实际场景可以是一个购物车类中的商品数量属性装饰器:

function validateQuantity(target: any, propertyKey: string) {
  let value = target[propertyKey];

  const getter = function () {
    return value;
  };

  const setter = function (newValue: number) {
    if (newValue < 0) {
      throw new Error("商品数量不能为负数。");
    }
    value = newValue;
  };

  Object.defineProperty(target, propertyKey, {
    get: getter,
    set: setter,
    enumerable: true,
    configurable: true,
  });
}

class ShoppingCart {
  @validateQuantity
  quantity: number;
}

方法装饰器

方法装饰器用于修饰类的方法,可以在方法定义之前对方法进行拦截、修改或者扩展。它可以用于验证输入、记录日志等场景。举个例子,假设有一个订单类,可以使用方法装饰器添加日志记录功能:

function log(target: any, methodName: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function (...args: any[]) {
    console.log(`调用方法 ${methodName},参数: ${JSON.stringify(args)}`);
    const result = originalMethod.apply(this, args);
    console.log(`方法 ${methodName} 返回值: ${JSON.stringify(result)}`);
    return result;
  };

  return descriptor;
}

class Order {
  @log
  calculateTotal() {
    // 计算订单总金额的逻辑
  }
}

解决痛点和实战案例

装饰器在 TS 中的作用非常重要,它可以帮助我们简化代码、增加功能,提高代码重用性和可维护性。以下是几个生活化场景的实例:

1. 性能监测

想象你在开发一个电子游戏,你可以使用装饰器来检测某个方法的执行时间,以便帮助你优化性能。你可以创建一个方法装饰器,用于打印方法的执行时间:

function performance(target: any, methodName: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function (...args: any[]) {
    const start = performance.now();
    const result = originalMethod.apply(this, args);
    const end = performance.now();
    console.log(`方法 ${methodName} 执行时间: ${end - start}ms`);
    return result;
  };

  return descriptor;
}

class Game {
  @performance
  play() {
    // 玩游戏的逻辑
  }
}

2. 权限控制

假设你正在开发一个论坛系统,不同用户具有不同的权限。你可以使用类装饰器来检查用户的权限,并对一些敏感操作进行限制。以下是一个模拟的权限控制的例子:

function checkPermission(permission: string) {
  return function (target: any) {
    const originalConstructor = target;

    const newConstructor = function (...args: any[]) {
      // 检查用户权限的逻辑
      if (!hasPermission(permission)) {
        throw new Error(`没有权限进行操作:${permission}`);
      }
      return new originalConstructor(...args);
    };

    newConstructor.prototype = originalConstructor.prototype;

    return newConstructor;
  };
}

@checkPermission("delete_post")
class Forum {
  deletePost(postId: string) {
    // 删除帖子的逻辑
  }
}

装饰器是 TS 中非常有用的特性,它可以帮助开发者在不修改原始代码的情况下,为代码添加功能和行为。通过使用装饰器,我们可以简化代码、增加功能,解决一些常见的痛点,如性能监测、权限控制等。

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

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

相关文章

【笔记】位运算

文章目录 位运算简介与运算&或运算|异或运算^证明 取反~左移<<右移>> 位运算技巧判断奇偶性求出x二进制的第i位将二进制的第i位设置成1将二进制的第i位设置成0判断是否为2的若干次方获取x的最低位的1用lowbit运算统计1的个数例题 位运算简介 位运算&#xff1…

【吊打面试官系列-Redis面试题】使用过 Redis 分布式锁么,它是什么回事?

大家好&#xff0c;我是锋哥。今天分享关于【使用过 Redis 分布式锁么&#xff0c;它是什么回事&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用过 Redis 分布式锁么&#xff0c;它是什么回事&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资…

对目录的操作、获取文件信息

目录 一、目录操作 二、获取文件的相关信息 1、演示获取文件的相关信息 2、注意事项和细节 一、目录操作 需求&#xff1a; 1&#xff09;创建一级目录 d://aaa 2&#xff09;创建多级目录 d://bbb//ccc 3&#xff09;删除目录 d://aaa和d://bbb//ccc import os# 1&am…

自定义AI模型的调优、部署与评测

为了让大语言模型的AI能力更贴近业务需求&#xff0c;本文详细介绍了在阿里云百炼创建自定义模型的最佳实践。即便不清楚大模型的技术细节&#xff0c;您也能按照本篇的操作指引创建一个有效的自定义模型&#xff0c;从而轻松地为业务场景添加大模型服务能力。 自定义模型概述…

深度学习数据集交通类常见图像分类、目标检测、分割图像数据集(深度学习数据集 - 交通类解决方案)

深度学习数据集 - 交通类解决方案 引言&#xff1a; 随着自动驾驶技术的发展以及智能交通系统的普及&#xff0c;对于高质量、多样化的交通数据集的需求日益增长。我们提供一系列精心准备的数据集&#xff0c;旨在帮助研究人员和工程师解决实际问题&#xff0c;推动技术创新。…

arcgisPro修改要素XY容差

1、在arcgisPro中XY容差的默认值为1个毫米&#xff0c;及0.001米。为了更精细的数据&#xff0c;需要提高这个精度&#xff0c;如何提高呢&#xff1f; 2、如果直接在数据库下新建要素类&#xff0c;容差只能调至0.0002米。所以&#xff0c;需要在数据库下新建要素数据集。 3…

机房运维工作的核心:确保系统稳定与高效

在当今的信息化时代&#xff0c;运维工作成为了确保企业信息系统稳定运行的关键环节。运维团队肩负着监控系统性能、处理故障、优化系统配置等多重任务&#xff0c;以确保平台的持续、高效运行。本文将围绕运维工作的几个核心方面展开讨论&#xff0c;并以监控易一体化运维软件…

【Linux下的cpp】编译调试(gcc、g++、gdb)

【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09; 文章目录 【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09;简述gcc、g、gdb编译过程g 编译参数命令行编译演练1、直接编译2、生成库文件并编译链接静态库并生成可执行文件链接动态库生成可执行文件 …

vue vueUse利用useInfiniteScroll API 实现虚拟滚动

前言 中文网地址:开始使用 | VueUse 中文网 官网地址:VueUse 元素的无限滚动。 useInfiniteScroll 详细解析地址 效果 组件封装

7-14 电话聊天狂人(map)

输入样例: 4 13005711862 13588625832 13505711862 13088625832 13588625832 18087925832 15005713862 13588625832输出样例: 13588625832 3 代码&#xff1a; #include<iostream> #include<map> using namespace std; map<string,int>mp; string ansstr;…

华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

nginx负载均衡(轮询与权重)

文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx&#xff08;engine x&#xff09;是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也是一个开源的、…

PASCAL VOC数据集语义分割:解决标签值错误与数据增强不同步问题的优化方案

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 错误原因分析&#xff1a; Assertion错误&#xff1a; 错误信息显示 Assertion t > 0 && t < n_classes failed.&#xff0c;这意味着在计算损失时&#xff0c;标签t的值不…

第四天旅游线路预览——从换乘中心到喀纳斯湖

第四天&#xff1a;从贾登峪到喀纳斯风景区入口&#xff0c;晚上住宿贾登峪&#xff1b; 换乘中心有4 路车&#xff0c;喀纳斯①号车&#xff0c;去喀纳斯湖&#xff0c;路程时长约5分钟&#xff1b; 将上面的的行程安排进行动态展示&#xff0c;具体步骤见”Google earth stu…

【devops】devops-git之github使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

继承和多态(详解)

&#x1f423;继承和多态 &#x1f31e; 继承&#x1f33b;1.引入&#x1f33b;2.访问父类成员&#x1f335;2.1 子类访问父类中的成员变量&#x1f335;2.2 子类访问父类中的成员方法 &#x1f33b;3.super关键字&#x1f33b;4.子类构造方法&#x1f33b;5.super和this&#…

java spring validation 自动、手动校验

目录 一、自动校验 第一步&#xff0c;导入依赖 第二步&#xff0c;统一异常处理 第三步&#xff0c;定义接口接收实体DTO 第四步&#xff0c;在Contoller接口中增加参数注解Validated 第五步&#xff0c;测试结果 二、手动校验 第一步&#xff0c;校验工具类 第二步&…

Protubuf入门

⼀、初识 ProtoBuf 1. 序列化概念 序列化和反序列化 序列化&#xff1a;把对象转换为字节序列的过程 称为对象的序列化。 反序列化&#xff1a;把字节序列恢复为对象的过程 称为对象的反序列化。 什么情况下需要序列化 存储数据&#xff1a;当你想把的内存中的对象状态…

Spring Boot环境下的读书笔记交流网络

第2章 技术介绍 2.1B/S架构 当向其他用户发送请求的功能时应用B/S模式具有独一无二的优点&#xff1a;用户请求通过网络向其他Web服务器发送时只需要通过浏览器就可以实现该功能。该功能的好处之一就是有效简化了客户端&#xff0c;大部分开发的软件只需要用浏览器即可&#xf…

QT Mode/View之View

目录 概念 使用已存在的视图 使用模型 使用模型的多个视图 处理元素的选择 视图间共享选择 概念 在模型/视图架构中&#xff0c;视图从模型中获取数据项并将它们呈现给用户。数据的表示方式不必与模型提供的数据表示形式相似&#xff0c;而且可能与用于存储数据项的底层数…