第十九章 TypeScript 装饰器Decorator

news2024/9/24 21:19:50

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()


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

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

相关文章

动手做简易版俄罗斯方块

导读:让我们了解如何处理形状的旋转、行的消除以及游戏结束条件等控制因素。 目录 准备工作 游戏设计概述 构建游戏窗口 游戏方块设计 游戏板面设计 游戏控制与逻辑 行消除和计分 判断游戏结束 界面美化和增强体验 看看游戏效果 准备工作 在开始编码之前…

Riscure TrueCode静动态代码分析工具介绍

True Code是一个安全代码开发和自动漏洞识别的解决方案,适用于软件开发生命周期(SDLC)和DevSecOps流程。 True Code使用LibFuzzer作为模糊工具来模糊目标程序或软件。 True Code - Automated embedded Software Security checks 设备上运行…

高速CAN 收发器AMIS30660CANH2RG 用于各种数据传输协议的调制解调器和收发器

AMIS30660CANH2RG CAN 收发器是控制器区域网络 (CAN) 协议控制器和物理总线之间的接口,可在 12 V 和 24 V 系统中使用。该收发器为总线提供差分发射功能,向 CAN 控制器提供差分接收功能。由于接收器输入较宽的共模电压范围和其他设计功能, 能…

C 多维数组

C 语言支持多维数组。多维数组声明的一般形式如下: type name[size1][size2]...[sizeN];例如,下面的声明创建了一个三维 5 . 10 . 4 整型数组: int threedim[5][10][4];二维数组 多维数组最简单的形式是二维数组。一个二维数组&#xff0c…

从JVM的退出机制分析Java程序的优雅关闭退出

前言 Java程序启动从main函数开始启动,是程序入口和主线程,但程序会在什么时候结束?为什么有的Java程序在启动后很快就结束了,比如HelloWorld程序,有的程序却能一直在运行,比如Tomcat启动后就一直保持进程…

揭秘物联网网关,如何工作?功能及选择网关的主要考虑因素

【前言】本篇为物联网硬件系列学习笔记,分享学习,欢迎评论区交流~ 在物联网时代,物联网网关至关重要。它充当传统通信网络和传感网络之间的桥梁。物联网网关作为M2M网关,可以实现各类感知网络之间、感知网络与通信网络之间的协议转…

粤嵌6818开发板如何理解Linux文件IO?

一、文件IO的概述 1、什么是文件? Linux下一切皆文件。普通文件、目录文件、管道文件、套接字文件、链接文件、字符设备文件、块设备文件。 2、什么是IO? input output:输入输出 3、什么是文件IO? 对文件的输入输出,把…

MySQL索引的创建与基本用法

MySQL索引 MySQL索引是一种数据结构,用于提高查询数据的效率。MySQL索引可以被看作是数据库表的“目录”。就像书籍的目录帮助我们快速找到特定章节的位置一样,数据库索引帮助数据库快速找到特定数据记录的位置。 MySQL索引的类型与创建方法 MySQL索引…

TR1 - Transformer起源与发展

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 1. Transformer的起源与发展 2017年Google在《Attention Is All You Need》中提出了Transformer结构用于序列标注,在翻译任务…

最细节操作 Linux LVM 逻辑卷管理

Linux LVM(逻辑卷管理) 周末愉快,今天带大家实战一下LVM! 一、LVM理论 LVM,即Logical Volume Manager,逻辑卷管理器,是一种硬盘的虚拟化技术,可以允许用户的硬盘资源进行灵活的调整和动态管理…

2023年五级区划省市县乡镇行政村社区边界数据

行政区划数据是重要的基础地理信息数据,根据国家统计局公布的数据,行政区划共分为五级,分别为省级、地级、县级、乡镇/街道级、村/社区级。 该套数据以2020-2023年国家基础地理信息数据中的县区划数据作为矢量基础,辅以高德行政区…

JavaSE:数据类型与变量

目录 一、前言 二、数据类型与变量 (一)字面常量 (二)数据类型 (三)变量 1.变量概念 2.语法格式 3.整型变量 3.1整型变量 3.2长整型变量 3.3短整型变量 3.4字节型变量 4.浮点型变量 4.1双精…

详解main函数参数argc、argv及如何传参

目录 1、main()函数参数 2、main函数如何传参 2.1 环境准备 2.2 通过 Powershell 窗口传参 2.3 通过vs界面传参 3、int main() 和 int main(int argc, char *argv[]) 特点 1、main()函数参数 在C语言中,main函数可以带参数。main函数的原型通常为以下两种形式…

第4章 数据架构

思维导图 架构是构建一个系统(如可居住型建筑)的艺术和科学,以及在此过程中形成的成果——系统本身。用通俗的话说,架构是对组件要素有组织的设计,旨在优化整个结构或系统的功能、性能、可行性、成本和用户体验。 将架…

Vue cli创建项目时键盘操作无效;vue3.0项目搭建自定义配置

一. 问题描述 在创建vue3.0项目时,在建好的文件夹,鼠标右键 git bash 使用 vue create my-vue3.0创建新项目时,键盘方向键失效,无法选中对应的选项(交互提示符不工作) 解决方案: 方案一 使用…

章文嵩等技术大咖共同探讨企业数据治理和降本增效策略运用!

3 月 16 日,AutoMQ 携手 OceanBase 开源社区、KubeBlocks 举行的《LLMs 时代下企业数据管理与降本增效之路》主题 meetup 顺利落幕。活动邀请了 AutoMQ 联合创始人 & CSO、Linux LVS 创始人 章文嵩,AutoMQ 联合创始人 & CTO、Apache RocketMQ 联…

一文秒懂什么是客服知识库

大家有没有遇到过这样的情况:打电话给客服,结果对方半天没明白你的问题,或者回答得牛头不对马嘴?这种时候,你是不是觉得特别郁闷,感觉自己的问题就像被丢进了黑洞,永远找不到答案?其…

利用pyvista库可视化点云

ShapeNet分割数据可视化对比 import os import glob import randomimport pyvista as pvresult_paths glob.glob(r./examples/shapenet/results/predict_err_ply/*/*) print(len(result_paths))case_id random.randint(0, len(result_paths) // 3) point_size 3 opacity 0.…

NX二次开发——选择对象控件(清空选择对象)

一、概述 选择对象控件在NX二次开发中经常使用,最近进行学习时发现一片博客中有清空选择对象控件中出现问题,我尝试着写了一下,应该可以解决博主中的问题,其实博主已经写的很详细了,几乎没怎么改,不知道是不…

又一个城市火了,媒介盒子盘点城市爆火原因

近日,“甘肃天水麻辣烫”在各大平台频频登上热搜榜,甘肃当地也及时接住了这泼天富贵,开通“麻辣烫专线”、机场高铁免费接、免费送门票等。这些措施似曾相识,因为在天水前,已经有淄博和哈尔滨这两个城市的案例可以供天…