前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TypeScript 装饰器

TypeScript 装饰器

作者头像
程序猿的栖息地
发布2024-02-17 15:43:51
1090
发布2024-02-17 15:43:51
举报
文章被收录于专栏:程序猿的栖息地

什么是装饰器

装饰器:就是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。

常见的装饰器

类装饰器、属性装饰器、方法装饰器、参数装饰器

装饰器的写法

普通装饰器(无法传参) 、 装饰器工厂(可传参)

装饰器是过去几年中js最大的成就之一,已是Es7的标准特性之一

开启装饰器支持

  1. 创建 tsconfig
代码语言:javascript
复制
tsc --init

2. 修改配置文件开启装饰器支持,添加 :

代码语言:javascript
复制
"experimentalDecorators": true

类装饰器(无法参数)

类装饰器在类声明之前被声明(紧靠着类声明)。类装饰器应用于类构造函数,可以用来监视,修改或替换类定义。

代码语言:javascript
复制
function decoratorForPerson( target:any ){
    target.prototype.userName = '张三..';
    // 静态属性
    target.age = 18;
}

@decoratorForPerson
class Person{
    userName: any;
    static age: Number;
}

let pserson = new Person();
console.log( pserson.userName );

console.log( Person.age );

装饰器工厂(可传参)

代码语言:javascript
复制
function decoratorForPerson( options:any ){
    return function( target:any ){
        target.prototype.userName = options.userName;
        target.prototype.age = options.age;
    }
}

@decoratorForPerson({
    userName: '张三',
    age:19
})
class Person{
    userName: any;
    age: any;
}

let pserson = new Person();
console.log( pserson.userName );
console.log( pserson.age );

装饰器组合

代码语言:javascript
复制
function demo1( target:any ){
    console.log('demo1')
}
function demo2(  ){
    console.log('demo2')
    return ( target:any )=>{
        console.log('demo2里面')
    }
}
function demo3( ){
    console.log('demo3')
    return ( target:any )=>{
        console.log('demo3里面')
    }
}
function demo4( target:any ){
    console.log('demo4')
}

@demo1
@demo2()
@demo3()
@demo4
class Person{
}

/*结果是:
demo2
demo3
demo4
demo3里面
demo2里面
demo1
*/

属性装饰器

代码语言:javascript
复制
function fun3( arg:any ){
    return ( target:any , attr:any )=>{
        target[attr] = arg;
    }
}

class Obj3{
    @fun3('张三')
    //@ts-ignore
    userName:string
}   
let obj3 = new Obj3();
console.log( obj3.userName );

六、方法装饰器

代码语言:javascript
复制
function test( target: any, propertyKey: string, descriptor: PropertyDescriptor ) {
    console.log( target );
    console.log( propertyKey );
    console.log( descriptor );
}

class Person {
    @test
    sayName() {
        console.log( 'say name...' )
       return 'say name...';
    }
}

let p = new Person();
p.sayName()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿的栖息地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是装饰器
  • 常见的装饰器
  • 装饰器的写法
  • 开启装饰器支持
  • 类装饰器(无法参数)
  • 装饰器工厂(可传参)
  • 装饰器组合
  • 属性装饰器
  • 六、方法装饰器
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档