第十九章 TypeScript 装饰器Decorator

Decorator 装饰器是一项实验性特性,在未来的版本中可能会发生改变

它们不仅增加了代码的可读性,清晰地表达了意图,而且提供一种方便的手段,增加或修改类的功能

若要启用实验性的装饰器特性,你必须在命令行或tsconfig.json里启用编译器选项

类装饰器  ClassDecorator

/**
 * 类装饰器  ClassDecorator
 * @param target  形参  target 是形参,可以是任何名字
 * @param  result  返回结果:构造函数
 * @param name
 * */
// const Base:ClassDecorator = (target)=>{
// 	target.prototype.heming  = "鹤鸣"
// 	target.prototype.fn = () =>{
// 		console.log('装饰器')
// 	}
// }

// 如果用户要传参数可以使用(闭包 或者 函数柯里化 或者 工厂函数)
const Base = (name:string) => {
	const fn: ClassDecorator = (target) => {
		target.prototype.heming = name
		target.prototype.fn = () => {
			console.log('装饰器')
		}
	}
	return fn
}

@Base('鹤鸣')
class Http {

}

const http = new Http() as any
console.log(http.heming)

// 或者怕不兼容可以
class Http{

}

const http = new Http() as any
Base(Http)
http.fn()

方法装饰器 MethodDecorator 

/**
 * 方法装饰器 MethodDecorator 接受三个参数
 * @param target 原型对象 不再是构造函数
 * @param key 方法的名字
 * @param descriptor PropertyDescriptor 描述符
 * */
const Get = (url:string) => {
	const fn:MethodDecorator = (target:any, key , descriptor:PropertyDescriptor) => {
		axios.get(url).then((res) => {
			descriptor.value(res.data)
		})
	}
	return fn
}

const Post = (url:string) => {
	const fn:MethodDecorator = (target:any,key, descriptor:PropertyDescriptor) => {
		axios.post(url).then((res)=>{
			descriptor.value(res.data)
		})
	}
}

@Base('鹤鸣')
class Http {
	@Get('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
	getList(@Result() data: any) {
		console.log(data.result.list, 'data')
	}
	
	@Post('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
	create() {
	
	}
}

3.参数装饰器


/**
 * 参数装饰器 ParameterDecorator
 * @param  target 原型对象
 * @param  key 方法名
 * @param index 数据所在的位置
 * @param  reflect-metadata  数据的反射
 * */

const Result = () => {
	const fn: ParameterDecorator = (target, key, index) => {
		Reflect.defineMetadata('key', 'result', target)
	}
	return fn
}


@Base('鹤鸣')
class Http {
	@Name
	heming: string
	
	constructor() {
		this.heming = '鹤鸣'
	}
	
	@Get('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
	getList(@Result() data: any) {
		console.log(data, 'data')
	}
	
	// @Post('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
	create() {
	
	}
}

const http = new Http() as any

综合代码

// 1.类装饰器 ClassDecorator  target 返回的是一个构造函数
//2.属性装饰器 PropertyDecorator
//3.参数装饰器 ParameterDecorator
// 4.方法装饰器 MethodDecorator PropertyDescriptor
// 5.装饰器工长
// 6. import 'reflect-metadata'
// 7.axios
import axios from 'axios';
import 'reflect-metadata'

/**
 * 类装饰器  ClassDecorator
 * @param target  形参  target 是形参,可以是任何名字
 * @param  result  返回结果:构造函数
 * @param name
 * */
// const Base:ClassDecorator = (target)=>{
// 	target.prototype.heming  = "鹤鸣"
// 	target.prototype.fn = () =>{
// 		console.log('装饰器')
// 	}
// }

// 如果用户要传参数可以使用(闭包 或者 函数柯里化 或者 工厂函数)
const Base = (name: string) => {
	const fn: ClassDecorator = (target) => {
		target.prototype.heming = name
		target.prototype.fn = () => {
			// console.log('装饰器')
		}
	}
	return fn
}

/**
 * 方法装饰器 MethodDecorator 接受三个参数
 * @param target 原型对象 不再是构造函数
 * @param key 方法的名字
 * @param descriptor PropertyDescriptor 描述符
 * */
const Get = (url: string) => {
	const fn: MethodDecorator = (target: any, _key: any, descriptor: PropertyDescriptor) => {
		let key = Reflect.getMetadata('key', target)
		axios.get(url).then((res) => {
			descriptor.value(key ? res.data[key] : res.data)
		})
	}
	return fn
}

// const Post = (url:string) => {
// 	const fn:MethodDecorator = (target:any,key, descriptor:PropertyDescriptor) => {
// 		axios.post(url).then((res)=>{
// 			descriptor.value(res.data)
// 		})
// 	}
// }

/**
 * 参数装饰器 ParameterDecorator
 * @param  target 原型对象
 * @param  key 方法名
 * @param index 数据所在的位置
 * @param  reflect-metadata  数据的反射
 * */

const Result = () => {
	const fn: ParameterDecorator = (target, key, index) => {
		Reflect.defineMetadata('key', 'result', target)
	}
	return fn
}

/**
 * 属性装饰器 PropertyDecorator
 * @param target 原型对象
 * @param key 属性
 * */
const Name: PropertyDecorator = (target, key) => {
	console.log(target, key)
}

@Base('鹤鸣')
class Http {
	@Name
	heming: string
	
	constructor() {
		this.heming = '鹤鸣'
	}
	
	@Get('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
	getList(@Result() data: any) {
		console.log(data, 'data')
	}
	
	// @Post('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
	create() {
	
	}
}

const http = new Http() as any
// console.log(http.heming)

// 或者怕不兼容可以
// class Http{
//
// }
//
// const http = new Http() as any
// Base(Http)
// http.fn()


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot+vue的高校教师科研管理系统+数据库+报告+免费远程调试

项目介绍: Javaee项目,springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的高校教师科研管理系统,采用M(model)V(view)C(controller)三层体系结构&#xf…

THM学习笔记—Bounty Hacker

nmap扫描,扫了一大堆但只有三个端口是开放的 试试ftp是否可以匿名登录 可以匿名登录,把里面的文件下载下来 查看里面的内容,猜lin为用户名,locks.txt为密码列表,使用hydra进行ssh登录。 找到密码了,进行ssh…

【Mybatis整合mysql之Json类型属性适配手把手】

【Mybatis整合mysql之Json类型属性适配&&手把手】 场景 JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 、TEXT或LONGTEXT )来保存 JSON 文档。在开发中发现,Mybatis查询…

AWS监控,AWS 性能监控工具

监控云部署的性能是 IT 环境正常运行的内在条件。AWS 云是一个架构良好的框架,管理员可以使用专用的AWS 性能监控工具增强服务的功能。执行AWS监视是为了跟踪在AWS环境中积极运行的应用程序工作负载和资源。AWS监视器跟踪各种AWS云指标,以帮助提高在其上…

电子证书查询系统如何制作证书?

1、制作空白证书:网上找一张证书背景图,用PPT工具或photoshop等图片处理工具,将证书上固定的文字打上,有公章的话贴上电子公章,不固定的内容留空白。 2、制作电子证书:上传前一步制作好的空白证书&#xf…

LeetCode刷题记录:(13)N皇后(难题不难)

leetcode传送通道 传说中的N皇后&#xff0c;不难&#xff0c;进来了就看完吧 注释序号代表鄙人写代码的顺序和思考逻辑&#xff0c;供参考 class Solution {// 1.定义结果数组List<List<String>> result new ArrayList<>();public List<List<String&…

moviepy简介及使用教程

moviepy简介及基本概念 MoviePy 是一个用于视频编辑的 Python 库&#xff0c;使用户能够处理、编辑和操作视频文件。这个库允许你剪辑视频、添加文本、合并视频剪辑&#xff0c;以及应用各种效果和转换。它建立在 NumPy、imageio 和 Decorator 等库的基础上&#xff0c;使得在…

部署mysql,前端,后端

部署mysql docker pull mysql 从镜像源中拉取镜像。 创建mysql容器 docker run -d \--name mysql_container \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \--restartalways \-v /opt/mysql:/var/lib/mysql \mysql -d后台运行&#xff0c;--name指定容器…

点餐小程序开发:如何通过抽奖与消费者互动

随着科技的发展&#xff0c;越来越多的商家开始使用点餐小程序来提升自己的服务质量和效率。然而&#xff0c;仅仅提供点餐服务并不能满足消费者的需求&#xff0c;他们还需要一种方式来增加与商家的互动&#xff0c;提高消费体验。抽奖活动就是一种非常有效的互动方式&#xf…

C++ stack和queue

什么是stack stack就是平常所说的栈&#xff0c;栈只能进行在固定的一端插入数据和删除数据的操作&#xff0c;也就是先进后出&#xff0c;后进先出 什么是queue queue是平常所说的队列&#xff0c;队列就像平常排队吃饭一样&#xff0c;先到的就有饭吃&#xff0c;只能从一端…

C语言每日一题07

一、题目 二、解析 逻辑与 &&、逻辑或 || 均有“短路”特性: 逻辑与&&“短路”&#xff1a;当逻辑与&&的左操作数为逻辑 “假“ 时&#xff0c;就足以判断该逻辑运算的结果为假了&#xff0c;故右操作数就不再被执行。 逻辑或||“短路”&#xff1a…

为什么大家都在“挺”鸿蒙?

试想某一天&#xff0c;应用软件能够在手机、电视、手表甚至汽车等设备上&#xff0c;实现无缝流转、纵享丝滑。 这不仅是畅想&#xff0c;而是鸿蒙正在布局的“遥遥领先”。 随着HarmonyOS NEXT鸿蒙星河版面向开发者开放申请、鸿蒙原生应用版图的基本成型&#xff0c;这个国…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——量子粒子群算法(QDPSO)

基于python语言&#xff0c;采用经典量子粒子群算法&#xff08;QDPSO&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作&#xff0c;目前…

【解决navicat登录报 insufficient privileges 错误】

今天使用navicat sysdba角色登录报 insufficient privileges 以下是解决方案&#xff1a; 1、使用管理员身份打开cmd登录 sqlplus sys/admin as sysdba2、给system用户授权 grant sysdba to system;登录navicat

Git——IDEA中的使用详解

目录 Git1、IDEA中配置Git2、将本地项目推送到远程仓库2.1、创建项目远程仓库2.2、初始化本地仓库2.3、连接远程仓库2.4、提交到本地仓库2.5、推送到远程仓库 3、克隆远程仓库到本地4、基本操作4.1、代码提交到暂存区4.2、暂存区代码提交到本地库4.3、推送到远程仓库4.4、撤销本…

QT的学习

代码练习 做一个UI登录页面 源文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowTitle("洛克启动&#xff01;");this->…

[python]bar_chart_race绘制动态条形图

最近在 B 站上看到了一个宝藏 up 主&#xff0c;名叫 "Jannchie见齐"&#xff0c;专门做动态条形图相关的数据可视化。 可以看到做出的效果还是很不错的&#xff0c;但工具使用的是 JS&#xff0c;不是 Python&#xff0c;于是尝试搜索了一下&#xff0c;看看 Python…

C语言实现高精度计时和高精度延时微秒级别

C语言实现高精度计时和高精度延时微秒级别 目的说明环境说明一、高精度延时(微秒级别)二、测试例程三、测试结果 目的说明 在Windows下C语言实现高精度计时功能和高精度延时微秒级别环境说明 Dev-C V5.11一、高精度延时(微秒级别) void vDelayUS(u32 usDelay) {LARGE_INTEGER…

机器学习-可解释性机器学习:支持向量机与fastshap的可视化模型解析

一、引言 支持向量机(Support Vector Machine, SVM)作为一种经典的监督学习方法&#xff0c;在分类和回归问题中表现出色。其优点之一是生成的模型具有较好的泛化能力和可解释性&#xff0c;能够清晰地展示特征对于分类的重要性。 fastshap是一种用于快速计算SHAP值&#xff08…

【C++】弥补C语言的不足(②有默认参数的函数)

&#x1f33b;缺省参数 我们先来看一个简单地例子&#xff0c;对于在函数的定义中三个形参都给定默认值&#xff1a; #include <iostream> using namespace std; void fun(int a 10, int b 20, int c 30) {cout << "a " << a << endl;…