TypeScript-访问器装饰器

简介: TypeScript-访问器装饰器

访问器装饰器概述


访问器装饰器声明在一个访问器的声明之前(紧靠着访问器声明) 访问器装饰器应用于访问器的属性描述符并且可以用来监视,修改或替换一个访问器的定义



访问器装饰器表达式会在运行时当作函数被调用,会自动传入下列 3 个参数:


  • 对于静态方法而言就是当前的类, 对于实例方法而言就是当前的实例
  • 成员的名字
  • 成员的属性描述符

对于静态方法而言就是当前的类, 对于实例方法而言就是当前的实例:


实例方法:

function test(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log(target);
    console.log(propertyKey);
    console.log(descriptor);
}
class Person {
    private _name: string;
    constructor(name: string) {
        this._name = name;
    }
    @test
    get name(): string {
        return this._name;
    }
    set name(value: string) {
        this._name = value;
    }
}

静态方法略




注意点


TypeScript 不允许同时装饰一个成员的 getset 访问器 取而代之的是,一个成员的所有装饰的必须应用在文档顺序的第一个访问器上

接下来先来看一个替换 set 方法的案例然后在来解释 TypeScript 不允许同时装饰一个成员的get和set访问器 这句话的含义,替换代码如下:

function test(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    descriptor.set = (value: string) => {
        target.myName = "JonathanLee";
    }
}
class Person {
    private _name: string;
    constructor(name: string) {
        this._name = name;
    }
    get name(): string {
        return this._name;
    }
    @test
    set name(value: string) {
        this._name = value;
    }
}
let p = new Person('yangbuyiya');
p.name = 'zs';
console.log(p.name);
console.log(p);


如上的代码含义为,我创建了一个 Person 对象然后重新设置了 name 但是 set 方法已经被我通过访问器装饰器给替换了,替换之后的 set 方法呢在实例上面添加了一个 myName 的属性所以浏览器当中依然会输出 yangbuyiya 如下:

通过如上的案例演示之后其实在访问器装饰器当中不仅仅可以拿到 set 其实 get 也是可以拿到的这就是如上我为什么说 TypeScript 不允许同时装饰一个成员的get和set访问器 的原因因为你只需要修饰其中一个另一个就可以直接拿到就没必须一一修饰了,然后我们在紧接着如上的案例来把 get 也替换一下看看如下:


function test(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    descriptor.set = (value: string) => {
        target.myName = "JonathanLee";
    }
    descriptor.get = (): string => {
        return target.myName;
    }
}
class Person {
    private _name: string;
    constructor(name: string) {
        this._name = name;
    }
    get name(): string {
        return this._name;
    }
    @test
    set name(value: string) {
        this._name = value;
    }
}
let p = new Person('yangbuyiya');
p.name = 'zs';
console.log(p.name);
console.log(p);




最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

相关文章
|
6月前
|
JavaScript 前端开发 数据安全/隐私保护
TypeScript中装饰器的概念与使用场景
【4月更文挑战第23天】TypeScript的装饰器是特殊声明,用于附加到类的声明、方法、属性或参数,以修改行为。它们以`@expression`形式,其中`expression`是运行时调用的函数。装饰器应用场景包括:日志记录、调试、依赖注入、权限控制和AOP。通过装饰器,可以实现动态行为修改,如添加日志、注入依赖、控制权限以及事务管理。然而,应谨慎使用,避免过度复杂化代码。装饰器在现代 TypeScript 开发中扮演重要角色,帮助编写更健壮、可维护的代码。
|
JavaScript 安全 数据安全/隐私保护
TypeScript-属性装饰器
TypeScript-属性装饰器
58 0
|
6月前
|
存储 JavaScript 前端开发
TypeScript 5.2 beta 浅析:新的关键字 using 与新版装饰器元数据
TypeScript 5.2 beta 浅析:新的关键字 using 与新版装饰器元数据
109 0
TypeScript-方法装饰器
TypeScript-方法装饰器
40 0
|
4月前
|
JavaScript 前端开发 索引
TypeScript(八)装饰器
TypeScript(八)装饰器
31 0
|
5月前
|
JavaScript 监控 编译器
29.【TypeScript 教程】装饰器(Decorator)
29.【TypeScript 教程】装饰器(Decorator)
48 0
|
6月前
|
缓存 JavaScript 前端开发
【TypeScript技术专栏】TypeScript中的装饰器与元编程
【4月更文挑战第30天】TypeScript的装饰器是元编程工具,用于修改类、方法等行为。它们允许实现日志、权限控制、缓存等功能,支持类装饰器、方法装饰器等多种类型。装饰器借助JavaScript的Proxy和Reflection API实现,但过度使用可能造成复杂性。正确运用能提升代码质量,但需注意类型安全和维护性。
96 0
|
6月前
react+typescript装饰器写法报错的解决办法
react+typescript装饰器写法报错的解决办法
85 1
|
6月前
|
存储 JavaScript 前端开发
TypeScript笔记(15)—— 深入理解TypeScript中的装饰器
TypeScript笔记(15)—— 深入理解TypeScript中的装饰器
89 0
|
6月前
|
JavaScript
如何使用 TypeScript 创建和使用装饰器
如何使用 TypeScript 创建和使用装饰器
42 0