TypeScript装饰器

本文详细介绍了JavaScript中的装饰器,包括类装饰器、访问器装饰器、属性装饰器、方法装饰器和参数装饰器的用法。通过实例展示了如何使用装饰器来监视、修改或替换类的定义,以及如何应用于属性、方法和参数。装饰器是一种非侵入式的代码修改方式,常用于柯里化函数,增强代码功能。
摘要由CSDN通过智能技术生成

是一种特殊类型的声明,用来监视,修改或替换类定义,它能够被附加到类声明,方法,访问符,属性或参数上。使用"@"符号作为前缀。也是对原有代码外层包装一层处理逻辑,是一种非侵入式的改变。一般实现函数类似于柯里化函数,返回一个函数作为返回值。一共有类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器这几种,但是没有有函数装饰器

一、类装饰器 不传递参数

/**
 * 一、类装饰器 不传递参数
 * @param target
 */
 
function testFn(target) {
  target.age = 18;
}
 
@testFn
export class TestCode {
  name = 'TectCode'
}
const code = new TestCode();
console.log(code .name, code .age); // TestCode 18
 
/**
 * 类装饰器 传递参数
 * @param age
 */
 
function testFn(age) {
  /**
 * target 类本身
   */
  return function (target) {
    target.age = age;
  }
}
 
@testFn(22)
export class TestCode {
  name = 'TectCode';
  age: number;
}
const code = new TestCode();
console.log(code .name, code .age);  // TestCode 22

二、 访问器装饰器 主要应用于get set 修改该成员属性

/**
 * 二 访问器装饰器  主要应用于get set 修改该成员属性
 * @param value
 */
 
function testFn(value) {
  /**
 * target 类本身
 * propertyKey 属性名称
 * descriptor 该属性的属性描述符
   */
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    descriptor.configurable = value;
  };
}
 
export class TestCode {
  name = 'TectCode';
  _age = 20;
  @testFn(false)
  get age() {
    return this._age;
  }
 
  @testFn(true)
  get ages() {
    return this._age;
  }
}

三、 属性装饰器 紧靠属性前面 用于对属性的处理

/**
 * 三 属性装饰器 紧靠属性前面 用于对属性的处理
 * @param value
 */
 
function testFn(value) {
  /**
 * 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
 * propertyKey 属性名称
   */
  return function (target: any, propertyKey: string) {
    if (delete target[propertyKey]) {
      Object.defineProperty(target, propertyKey, {
        get: () => {
 
        },
        set: () => {
 
        },
        enumerable: true,
        configurable: true
      });
    }
  };
}
 
export class TestCode {
  @testFn('Hello ')
  name = 'TectCode';
}

四、 方法装饰器 紧靠方法前面 用于对方法的替换、修改等处理

/**
 * 四 方法装饰器 紧靠方法前面 用于对方法的替换、修改等处理
 * @param value
 */
 
function testFn() {
  /**
 * 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
 * propertyKey 属性名称
   */
  return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
 
  };
}
 
export class TestCode {
  @testFn
  name() {
    return 'TestCode'
  };
}

五、 参数装饰器 紧靠参数前面 用于监视参数是否被传入

/**
 * 五 参数装饰器 紧靠参数前面 用于监视参数是否被传入
 */
 
function testFn() {
  /**
   * 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
   * propertyKey 属性名称
   * 参数在函数参数列表中的索引
   */
  return function (target: any, propertyKey: string, parameterIndex: number) {
 
  };
}
 
export class TestCode {
  name( @testFn _name) {
    return 'TestCode'
  };
}
TypeScript装饰器是一种特殊的语法,用于修改类、方法、属性或参数的行为。装饰器通过在目标声明之前使用@符号来应用。装饰器可以用来添加新的功能、修改行为或元数据。 装饰器可以应用于类、方法、属性和参数。例如,可以使用装饰器来为类添加日志记录、验证或路由等功能。 下面是一个示例,演示如何使用装饰器添加日志记录功能: ```typescriptfunction log(target: any, name: string, descriptor: PropertyDescriptor) { const originalMethod = descriptor.value; descriptor.value = function (...args: any[]) { console.log(`Calling ${name} with arguments: ${JSON.stringify(args)}`); const result = originalMethod.apply(this, args); console.log(`Method ${name} returned: ${JSON.stringify(result)}`); return result; }; return descriptor; } class MyClass { @log myMethod(arg: string) { return `Hello, ${arg}!`; } } const instance = new MyClass(); instance.myMethod("World"); ``` 在上面的示例中,我们定义了一个名为log的装饰器函数。该装饰器函数接收三个参数:目标对象、方法名和属性描述符。我们通过修改属性描述符的value来修改原始方法的行为,添加了日志记录的功能。 然后,我们将装饰器应用于MyClass类的myMethod方法。当调用myMethod方法时,会自动触发装饰器中定义的日志记录逻辑。 通过使用装饰器,我们可以轻松地修改类的行为,而无需在每个方法中手动添加相同的功能。这样可以提高代码的可重用性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值