首页 > 其他分享 >(TS)装饰器

(TS)装饰器

时间:2023-07-01 13:00:24浏览次数:45  
标签:console log 方法 TS 声明 装饰 构造函数


准备工作:开启ts的装饰器特性,需要在tsconfig.json中开启experimentalDecorators。

{
  "compilerOptions": {
    "target": "ES5",
    "experimentalDecorators": true
  }
}

类装饰器

类装饰器在类声明之前声明。类装饰器应用于类的构造函数,可用于观察、修改或替换类定义。类装饰器不能用于声明文件或任何其他环境上下文(例如声明类)。

类装饰器的表达式将在运行时称为函数,装饰类的构造函数作为其唯一的参数。

如果类装饰器返回一个值,它将用提供的构造函数替换类声明。

下面是两个使用例子,一个无参,一个有参:

const getEat: ClassDecorator = (constructor: Function) => {
    constructor.prototype.message = (context:string) => {
        console.log(context);
      }
}
function getRun(txt: string):(constructor: Function)=>void{
    return (constructor:Function)=>{
        constructor.prototype.run=()=>{
            console.log(txt)
        }
    }
}
@getEat
class apple {
    public logMsg(){
        (this as any).message('成功啦')
    }
}
@getRun('runrurnrun')
class banana {
    public logMsg(){
        (this as any).run()
    }
}
new apple().logMsg()
new banana().logMsg()

结果为:

成功啦
runrurnrun

类装饰器只有一个参数target,他是一个构造函数,上面两个方法示范了无参和传参的两种形式。

但是有人应该注意到我是怎么使用'新加'的函数的:(this as any).run(),这是因为ts不你呢个为装饰器提供类型保护,不知道我们已经修改了Class。

VnRpbYtrPvk9Wce

​ (直接使用就会直接报红)

所以我看到的实际类装饰器使用场景是子类中修改父类中已经存在的函数方法。

方法装饰器


方法装饰器在方法声明之前声明。方法装饰器应用于方法的属性描述符,可用于观察、修改或替换方法定义。方法装饰器不能用于声明文件、重载或任何其他环境上下文

方法装饰器会传入三个参数

  • target:要么是静态成员的类的构造函数,要么是实例成员的类原型。
  • propertyKey:方法名
  • descriptor:方法的描述对象

下面是一个使用例子:

function logMsg1(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log('原型:',target)
    console.log('方法名:',propertyKey)
    console.log('方法描述对象:',descriptor)
    msg='xXXXx,no ! 01'
}
let msg:string='my name is 01'
class Person{

    @logMsg1
    public msgName(){
        console.log(msg)
    }
}
new Person().msgName()

输出为:

原型: { msgName: [Function (anonymous)] }
方法名: msgName
方法描述对象: {
  value: [Function (anonymous)],
  writable: true,
  enumerable: true,
  configurable: true
}
xXXXx,no ! 01

多用于方法重载实现,给方法添加额外功能等。

属性装饰器


属性装饰器是在属性声明之前声明的。属性修饰符不能用于声明文件或任何其他环境上下文(例如在declare类中)。

属性装饰器的表达式将在运行时作为函数调用,具有以下两个参数:

  • 静态成员的类的构造函数,或实例成员的类原型。
  • 成员名称

可以用来修改成员的属性

需要注意的是:属性装饰器只能用于已为类声明了特定名称的属性。

标签:console,log,方法,TS,声明,装饰,构造函数
From: https://www.cnblogs.com/oOLzYOo/p/17519142.html

相关文章

  • Ubuntu LTS 版本
        在Linux的世界里,特别是谈到 Ubuntu 的时候,你会遇到LTS(长期支持LongTermSupport)这个词。如果你是一个经验丰富的Linux用户,你可能知道Linux发行版的各个方面,比如LTS版本。但是,新用户或不太懂技术的用户可能不知道。在这一章Linux黑话解释中,你将了解什......
  • Pyside6-QtCharts+psutil实战-绘制一个CPU监测工具
    今天是实战篇章,我们结合可以快速提升我们开发效率的工具一起开实战一波实时读取系统CPU使用情况的折线图。使用的开发工具QtDesigner来开发UI界面。十分便捷。使用起来也算比较的简单了,虽然也存在不少的BUG。对所需要的控件进行拖拽式,就OK。后续会出一个简单的视频录制。第二步,......
  • XTTS系列之二:不可忽略的BCT
    重要系统Oracle数据库U2L迁移场景中,如果客户来问我建议,我都会回复说首选就是XTTS,除非XTTS经测试实在是无法满足停机窗口,否则就不要考虑OGG这类方案。换句话说,选择OGG做迁移的场景,都是没有其他办法时才会选用的方案了。而在这类XTTS的迁移项目中,我认为bct的技术是至关重要的,因......
  • python: more Layer Architecture and its Implementation in SQLite
    sqlite3:CREATETABLEDuStudentList( StudentId INTEGERPRIMARYKEYAUTOINCREMENT, StudentName TEXTNOTNULL, StudentNO TEXTNOTNULL, StudentBirthday DATETIME );Model:"""StudentListInfo.py学生类date2023-06-16edit:GeovinD......
  • python + requests:请求头('Content-Type': 'multipart/form-data'),并且files和其他参数
    解释1.在使用'Content-Type':'multipart/form-data'上传文件时,你需要将文件作为请求体的一部分进行传输。而由于文件可能非常大,因此需要将文件分成多个部分进行传输。这就需要使用多部分编码(MultipartEncoding)来将文件分割成多个部分,并将每个部分与其它的表单数据一起打包到一......
  • requirements.txt
    在Python中,你可以使用pip命令来安装依赖包。如果你想要一键安装全部依赖包,你可以创建一个requirements.txt文件,将所有需要安装的依赖包名称以及版本号写入该文件,然后使用以下命令进行安装:pip install -r requirements.txt这将会自动安装requirements.txt文件中列出的所有依......
  • export,export default,exports - 导入导出方法总结
    1.export.default的使用方法特点:export.default向外暴露的成员,可以使用任意变量来接收在一个模块中,exportdefault只允许向外暴露一次在一个模块中,可以同时使用exportdefault和export向外暴露成员//exportdefault-默认导出constm=100;exportdefaultm;//导入......
  • requests库的100种妙用!
    Python的requests库是一个功能强大且广泛使用的HTTP请求库,用于在Python中发送HTTP请求、处理响应、会话管理、Cookie处理以及处理文件上传和下载等方面提供了强大的功能,总的来说,就是:可能有的小可爱不是很能直观了解,今天,我们就一起来看看,requests库到底能做什么。1.发送HTTP请求最被......
  • 云享·案例丨打造数智物流底座,华为云DTSE助力物联云仓解锁物流新“速度”
    摘要:华为云凭借领先的技术和快速响应的开发者支持服务,助力物联亿达实现云上资源高可用、提升系统安全性与稳定性,为物联亿达提供了扎实的数字化基础。本文分享自华为云社区《云享·案例丨打造数智物流底座,华为云DTSE助力物联云仓解锁物流新“速度”》,作者:华为云社区精选。数字化......
  • vue3+tsx开发语法详解
    参考链接vue3+tsx开发语法详解vue3官方文档和jsx的使用......