typescript装饰器-类装饰器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了typescript装饰器-类装饰器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1674字,纯文字阅读大概需要3分钟。
内容图文
![typescript装饰器-类装饰器](/upload/InfoBanner/zyjiaocheng/1317/9d3c39ca35ba4f78aee84263952ab820.jpg)
type Ctor<T> = new (...args: any[]) => T function auto<T>(className: Ctor<T>) { returnfunction (target: any, attr: any) { // target 是类的原型对象, attr 属性的名称 (url) console.log(target); console.log(attr); console.log(className) target[attr] = new className(); } } function autoClass<T extends { new(...args: any[]): any }>(constructor: T) { return class extends constructor { name = "new property"; age = "override"; } } class Name { constructor() { } consoleMsg() { console.log(22222) } } @autoClass class Greeter { property = "property"; hello: string; name: string age: string @auto(Name) newProperty: Name constructor(hello: string) { this.hello = hello } getMsg() { this.newProperty.consoleMsg() } } let greeter = new Greeter(‘你好‘); console.log(greeter) console.log(greeter.name) console.log(greeter.age) greeter.getMsg()
运行结果:
如果Greeter类中没有属性name和age的话,类实例greeter需要设置为类型为any,否则无法使用greeter.name和greeter.age。因为name和age是是通过装饰器后期添加上去的!
如果想直接使用greeter.name和greeter.age,可以参考下面代码
function autoClassV2() {
// 泛型 T 继承了一个构造函数,则说明T是包含构造函数的一种类型 return function autoClass<T extends { new(...args: any[]): any }>(constructor: T) { return class extends constructor { name = "new property"; age = "override"; } } } class Test { property = "property"; hello: string; name: string age: string @auto(Name) newProperty: Name constructor(hello: string) { this.hello = hello } getMsg() { this.newProperty.consoleMsg() } } // 将装饰后的类赋值给 Test1 const Test1 = autoClassV2()(Test) let test1 = new Test1(‘你好‘); console.log(test1) console.log(test1.name) console.log(test1.age) test1.getMsg()
运行结果
原文:https://www.cnblogs.com/wuchen-wanou/p/14915374.html
内容总结
以上是互联网集市为您收集整理的typescript装饰器-类装饰器全部内容,希望文章能够帮你解决typescript装饰器-类装饰器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。