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

news2024/9/27 21:27:26

嘿,朋友!听说过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/2137598.html

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

相关文章

用Inno Setup打包QT程序输出安装包

InnoSetup打包编译好的QT程序 文章目录 InnoSetup打包编译好的QT程序介绍具体步骤自定义脚本更改引入配置文件/动态库路径申请管理员权限设置安装过程界面的图标和图片C程序依赖运行库 介绍 Inno Setup&#xff1a;用于打包安装程序 具体步骤 首先打开inno setup compiler 第…

MES系统:智能工厂与数字化改造的关键引擎

一、概念范畴&#xff1a; 数字化工厂&#xff1a;是一个更广泛的概念&#xff0c;它强调整个制造过程的数字化转型&#xff0c;包括从产品设计、生产准备、制造过程、管理到营销等各个环节的数字化。数字化工厂利用信息技术、自动化技术和智能化技术对传统工厂进行改造和升级…

怎样在备忘录中添加提醒?怎么设置备忘录提醒

备忘录作为我们日常生活中常用的软件&#xff0c;其记录事项的便捷性已经得到了广泛认可。无论是工作计划、购物清单还是个人日记&#xff0c;备忘录都能帮助我们将这些信息快速记录下来。然而&#xff0c;如果备忘录能够进一步提供提醒功能&#xff0c;那么它将变得更加实用&a…

为什么要用docker?

目录 一、为什么会有docker出现 二、docker理念 三、容器与虚拟机的差异 四、开发/运维&#xff08;DevOps&#xff09; 五、企业级应用 一、为什么会有docker出现 一款产品从开发到上线&#xff0c;从操作系统&#xff0c;到运行环境&#xff0c;再到应用配置。作为开发…

pytorch快速入门(一)—— 基本工具及平台介绍

前言 该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用 环境配置&#xff1a;Anaconda Python编译器&#xff1a;pycharm、jupyter 两大法宝函数 dir&#xff08;&#xff09;&#xff1a;知道包中有什么东西&#xff08;函数 / 属性..…

串口数据波形显示工具对比

目录 1 Serial Port Plotter 1.1 界面 1.2 简介 1.3 使用方法 1.3.1 单通道示例 1.3.2 多通道示例 2 serialplot 2.1 界面 2.2 简介 2.3 使用方法 1 Serial Port Plotter 1.1 界面 1.2 简介 这是一款开源串口显示工具&#xff0c;项目链接&#xff1a; GitHub - C…

待机模式中WKUP上升沿模拟开机与关机

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 待机模式 代码 wkup.h wkup.c main.c 使用注意 前言 建议先阅读下面的博客中待机模式部分。本博客主要分享代码-基于待机模式WKUP引脚的上升沿实现类似长按开机与关机的功能…

TikTok云手机解决运营效率低、封号问题

TikTok&#xff0c;一个拥有30亿下载量、10亿活跃用户的全球热门平台&#xff0c;已成为众多出海商家的首选运营阵地。其玩法与国内抖音相似&#xff0c;为运营者提供了熟悉的操作环境&#xff0c;降低了上手难度。然而&#xff0c;随着TikTok的快速发展&#xff0c;运营者们也…

德之匠信息化阶段模型

今天适逢仲秋佳节&#xff0c;祝大家幸福安康&#xff01; 春生、夏长、秋天也是我们作为知识工作者最开心的季节。经历了项目实践、课题研究&#xff0c;终于能思有一得&#xff0c;是世上第一等的好事。 这个题目的背景是这样。近期我们在做一批中长期信息化项目的分析和总…

深度学习基础案例5--运用动态学习率构建CNN卷积神经网络实现的运动鞋识别(测试集的准确率84%)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 前几天一直很忙&#xff0c;一直在数学建模中&#xff0c;没有来得及更新&#xff0c;接下来将恢复正常这一次的案例很有意思&#xff1a;在学习动态调整…

【IP协议】解决 IP 地址不够用的问题(IP地址管理:动态分配、NAT、Ipv6)

文章目录 方案一、动态分配 IP 地址方案二、NATNAT 机制的缺点 方案三、IPv6 方案一、动态分配 IP 地址 一个设备上网就分配 IP&#xff0c;不上网就先不分配&#xff08;权宜之计&#xff09; 方案二、NAT 网络地址转换 以一当千&#xff0c;使用一个 IP&#xff0c;代表一大…

Golang | Leetcode Golang题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; func isLeafNode(node *TreeNode) bool {return node.Left nil && node.Right nil }func sumOfLeftLeaves(root *TreeNode) (ans int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {node : q[0]q q[1:]if no…

anaconda 离线安装PySimpleGUI

下载离线py包 PySimpleGUI-5.0.6-py3-none-any.whl&#xff08;官网&#xff09;pyasn1-0.6.1-py3-none-any.whl&#xff08;清华镜像&#xff09;rsa-4.9-py3-none-any.whl&#xff08;清华镜像&#xff09; 打开Anaconda Prompt 测试 # -*- utf-8 -*- import PySimpleGUI …

同城找搭子小程序有哪些?找搭子社交软件测评笔记分享

寻找搭子不再迷茫&#xff01;今日测评几款热门找搭子小程序&#xff0c;为你开启全新社交体验。真实体验&#xff0c;深度剖析&#xff0c;帮你找到最适合的搭子平台&#xff0c;快来一探究竟。 1. 咕哇找搭子小程序&#xff1a;这是一个实名制的找搭子交友平台。正是由于实名…

任务通知(Task Notifications)

任务通知简介 相对于以前使用 FreeRTOS 内核通信的资源&#xff0c; 必须创建队列、 二进制信号量、计数信号量或事件组的情况&#xff0c; 使用任务通知显然更灵活。 按照 FreeRTOS 官方的说法&#xff0c; 使用任务通知比通过信号量等 IPC 通信方式解除阻塞的任务要快 45%&a…

基于RFID的门禁系统的设计(论文+源码)

1系统方案设计 通过需求分析&#xff0c;基于RFID的门禁系统总体设计框图。系统采用STM32单片机作为系统主控核心&#xff0c;利用独立按键与RFID识别模块能够实现门禁系统密码与IC卡开门功能。WiFi模块实现系统与手机APP的通信&#xff0c;用户可以通过手机APP进行门禁开关操…

怀孕之天赋共享:提高智商

想办法怀个哪吒享受三年&#xff0c;哈哈哈哈哈 话说我们有个同事&#xff0c;是属于憨得有点愣那种&#xff0c;情商也低。怀孕以后突然有一天我觉得她聪明了好几个数量级&#xff01;反应也快了说话也会说了&#xff0c;我说是不是她的宝宝给她提高了智商&#xff1f;后来生…

Redis学习——数据不一致怎么办?更新缓存失败了又怎么办?

文章目录 引言正文读写缓存的数据一致性只读缓存的数据一致性删除和修改数据不一致问题操作执行失败导致数据不一致解决办法 多线程访问导致数据不一致问题总结 总结参考信息 引言 最近面试快手的时候被问到了缓存不一致怎么解决&#xff1f;一开始还是很懵的&#xff0c;因为…

Git 的使用以及vscode 下git 的使用(一)

1、git 和svn Git 和 SVN 都是版本控制系统&#xff0c;它们都用于管理代码的版本&#xff0c;但它们之间有一些显著的区别&#xff1a; 分布式 vs 集中式&#xff1a;Git 是一个分布式版本控制系统&#xff0c;这意味着每个开发者都拥有整个代码库的完整副本&#xff0c;并且…

3DTiles —— 三维瓦片

文章目录 一、glTF二、3DTiles1.3dTiles的特点2.一个简单的3dTiles数据示例3.Tileset——(三维)瓦片数据集——.json顶级属性概览(必需)&#xff1a;asset、root、geometricError其他属性root、children、refine、content、boundingVolumechildrenrefine 细化bounding volumes …