【TypeScript】装饰器 Decorator

news2024/11/16 19:39:15

装饰器(Decorators)是 TypeScript 中一种特殊的语法,用于在类、方法、属性等元素上附加元数据或修改其行为。装饰器提供了一种在不改变类的定义的情况下,对类进行扩展或修改的方式。

装饰器的使用类似于注解,在代码中以 @ 符号开头,后面紧跟装饰器工厂函数或表达式。装饰器工厂函数会在装饰器被应用到类、方法等上时被调用,它接受不同的参数,具体取决于被装饰的目标。

其实装饰器就是一个可以提前拿到类本身(或原型对象)并预处理的函数。当类定义的时候被调用。

使用装饰器之前,需要先在 tsconfig.json 中开启两个配置:

在这里插入图片描述

以下是一些常见的装饰器的用法和示例:

  1. 参数装饰器
import axios from 'axios'
// 使用 defineMetadata 需要 npm i reflect-metadata
import 'reflect-metadata'
const Get = (url: string) => {
  // _ 是一个占位符,防止和下面的 key 重名
  const fn: MethodDecorator = (target, _, descriptor: PropertyDescriptor) => {
    // console.log(target, key, descriptor)
    const key = Reflect.getMetadata('key',target)
    axios.get(url).then(res => {
      descriptor.value(key ? res.data[key] : res.data)
    })
  }
  return fn
}
const Result = () => {
  const fn: ParameterDecorator = (target, key, index) => {
    Reflect.defineMetadata('key', 'result', target)
    // console.log(target, key, index) // {} getList 0
  }
  return fn
}
class Http {
  @Get('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
  // @Result() 参数装饰器
  getList(@Result() data: any) {
    console.log(data);
  }
}
  1. 类装饰器:

    类装饰器用于装饰类的声明。它接受一个参数,即被装饰的类的构造函数。

function logClassName(constructor: Function) {
  console.log(`Class name: ${constructor.name}`);
}

@logClassName
class MyClass {
  // ...
}

// 写成匿名函数形式:
const Base:ClassDecorator = (target) =>{
console.log(target)
target.prototype.xx = 'xx'
target.prototype.fn = () =>{
  console.log('fn')
}
}
@Base
class Http {
// ...
}
const http = new Http() as any
// Base(Http) // 删掉 @Base,写成这样也是可以的
http.fn()
  1. 方法装饰器:

    方法装饰器用于装饰类的方法。它接受三个参数:目标类的原型,方法名称,方法的属性描述符。

function logMethod(target: any, methodName: string, descriptor: PropertyDescriptor) {
  console.log(`Method ${methodName} is decorated.`);
}

class MyComponent {
  @logMethod
  doSomething() {
    // ...
  }
}

// 实例:
import axios from 'axios'
const Get = (url: string) => {
const fn: MethodDecorator = (target, key, descriptor: PropertyDescriptor) => {
  console.log(target, key, descriptor)
  axios.get(url).then(res => {
    descriptor.value(res.data)
  })
}
return fn
}
class Http {
@Get('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10') 
getList(data: any) {
  console.log(data.result.list)
}
}
  1. 属性装饰器:

    属性装饰器用于装饰类的属性。它接受两个参数:目标类的原型和属性名称。

function readonly(target: any, propertyName: string) {
  Object.defineProperty(target, propertyName, { writable: false });
}

class Person {
  @readonly
  name: string = "Alice";
}
  1. 装饰器工厂:

    装饰器工厂是一个函数,用于生成装饰器。它可以接受参数,用于传递额外的配置信息。

function log(message: string) {
  return function(target: any, propertyName: string) {
    console.log(`Logged message: ${message}`);
  };
}

class Product {
  @log("Product created")
  name: string;
}

需要注意的是,装饰器的执行顺序是从上往下的,即从最外层的装饰器开始执行。装饰器可以叠加在一起,对同一个目标进行多次装饰。

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

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

相关文章

胖小酱之我没全抄

如果你在考试中抄袭同桌的答案被发现,这是一个严重的违规行为,可能会对你的成绩和未来的学业产生不利影响。以下是一些应对这种情况的建议:1. 承认错误:首先,你需要承认自己的错误,并向老师道歉。你可以向老…

矢量图层中要素的几何特征和属性特征的访问

打开QGIS Desktop 3.22.16,加载一个矢量图(Ex48/area.shp) 激活当前矢量图层 layeriface.activeLayer() 获取当前矢量图层矢量数据的个数 from qgis.utils import ifacelayer iface.activeLayer() # 得到当前激活的图层 print(layer.id()…

计算机图形视觉基础

一、环境安装 1、anaconda安装 官网下载:Free Download | Anaconda 2、打开anaconda prompt测试是否安装成功 输入conda env list命令显示虚拟环境清单即可 二、创建开发虚拟环境 1、创建python3.8虚拟环境 conda create --name demo_py3.8 python3.8 2、激…

渠道窜货怎么解决

品牌渠道中的常见问题有哪些? 低价、窜货是品牌需要治理的渠道常见问题,一般说到窜货就会提到低价,因为这两者是密不可分的,低价会带来窜货,窜货也必然有低价的影响,所有违规行为的背后,都是有…

Unity - 制作package 插件包

1.将制作的插件包代码放置一个根目录下 2.在跟目录下创建package.json文件 //package.json {"name": "com.unity.customlibrary", //插件包名:com.组织名.包名"displayName": "CustomLibrary", //显示的插件名"v…

程序员行业有必要考PMP吗?

首先,给大家简单普及一下什么是PMP? PMP(Project Management Professional)指项目管理专业人士(人事)资格认证。美国项目管理协会(PMI)举办的项目管理专业人员(PMP)认证考试在全球1…

海思Hi3861L开发二-SDK编译与下载

一、简介 上篇文章,我们介绍了海思Hi3861L的环境搭建,那这篇文章,我们就开始SDK的编译与下载吧。 准备: SDK:https://download.csdn.net/download/qq_26226375/88245580 开发环境:海思Hi3861L开发一-环境搭建_t_guest的博客-CSDN博客 二、SDK介绍 将SDK解压后,会出现如…

【Java架构-包管理工具】-Maven基础(一)

本文摘要 Maven作为Java后端使用频率非常高的一款依赖管理工具,在此咱们由浅入深,分三篇文章(Maven基础、Maven进阶、私服搭建)来深入学习Maven,此篇为开篇主要介绍Maven概念、模型、安装配置、基本命令 文章目录 本文…

2023-8-24 模拟堆

题目链接&#xff1a;模拟堆 #include <iostream> #include <string.h>using namespace std;const int N 100010;int h[N], ph[N], hp[N], Size;void heap_swap(int a, int b) {swap(ph[hp[a]], ph[hp[b]]);swap(hp[a], hp[b]);swap(h[a], h[b]); }void down(in…

基于大数据+django+mysql的学习资源推送系统的设计与实现(含报告+源码+指导)

本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库&#xff0c;而Python技术&#xff0c; B/S架构则保证了较高的平台适应性。文中主要是讲解了该系统的开发环境、要实现的基本功能和开发步骤&#xff0c;并主要讲述了系统设计方案的关键点、设计思想。 由于篇幅限制…

Bigemap软件常见实操疑问解答

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP Bigemap gis office 国产地图编辑工具作为一个大众化软件&#xff0c;他的操作其实是相对简单的&#xff0c; 可操作的功能也非常广泛&#xff0c; 所以就会有各行各业…

【uni-app】压缩图片并添加水印

总体思路 dom 结点 这里的 cvHeight 和 cvWidth 初始时要设置为你后续需要压缩后的最大宽高。假设我们在图片上传后图片最大为 350 * 350 <u-upload :fileList"baseInfoFormData.entrustFileList" afterRead"afterFileRead" multiple></u-uploa…

2023前端求职经历回顾及面试题总结

文章目录 前言一、求职经历二、前端面经1. 投简历的正确打开方式2. 面经及面试题复盘外企面经、面试题大厂面经、面试题面试中的笔试有三种笔试题 给同行的温馨提示我的其他热门文章 前言 2023 年的春节之前&#xff0c;几乎没有公司招人&#xff0c;直到 2023年2月10日 左右&a…

科技资讯|苹果Apple Watch新专利,可根据服装、表带更换表盘颜色

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果公司近日获得了一项 Apple Watch 相关的技术专利&#xff0c;最大的亮点在于配备颜色采样传感器&#xff0c;可以根据表带、服装自动变幻变盘颜色和主题。 Apple Watch 正面配备颜色采样传感器&am…

Python快速入门体验

Python快速入门体验 一、环境信息1.1 硬件信息1.2 软件信息 二、Conda安装2.1 Conda介绍2.1.1 Conda简介2.1.2 Conda、Anaconda及Miniconda及的关系 2.2 Conda安装包下载2.2.1 Miniconda下载2.2.2 Anconda下载 2.3 Conda安装2.3.1 Miniconda安装2.3.2 Anconda安装 2.4 Conda初始…

微信小程序的springboot实现 个人行程日程安排系统

本站后台采用Java的springboot框架进行后台管理开发&#xff0c;可以在浏览器上登录进行后台数据方面的管理&#xff0c;MySQL作为本地数据库&#xff0c;微信小程序用到了微信开发者工具&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特…

openCV实战-系列教程5:边缘检测(Canny边缘检测/高斯滤波器/Sobel算子/非极大值抑制/线性插值法/梯度方向/双阈值检测 )、原理解析、源码解读

1、Canny边缘检测流程 Canny是一个科学家在1986年写了一篇论文&#xff0c;所以用自己的名字来命名这个检测算法&#xff0c;Canny边缘检测算法这里写了5步流程&#xff0c;会用到之前《openCV实战-系列教程》的内容。 使用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除…

揭开Android系统启动的神秘面纱

当有人问我们android中app启动流程的时候&#xff0c;我们总是会提到zygote。but&#xff0c;zygote又是从何而来&#xff1f;由此问题我想到了android系统的启动流程&#xff0c;zygote肯定是在系统初始化时创建的一个进程。带着这个疑问我去查询了一些android系统启动流程的资…

Linux配置nginx反向代理

在云服务器上部署高并发的服务&#xff0c;使用Nginx作为反向代理是一种常见的做法&#xff0c;可以实现流量分发、负载均衡&#xff0c;同时提升系统的可靠性和性能。 步骤概览&#xff1a; 安装Nginx&#xff1a; 确保服务器已安装Nginx。若未安装&#xff0c;可使用适用于你…

【c语言】文件操作 万字详解

目录 一&#xff0c;为什么使用文件 二&#xff0c;什么是文件 1&#xff0c;程序文件 2&#xff0c;数据文件 3&#xff0c;文件名 三&#xff0c;文件的打开和关闭 1&#xff0c;文件指针 2&#xff0c;文件的打开和关闭 四&#xff0c; 文件的顺序读写 1&#xff0c;顺序…