学习nestjs 浅聊一下ts 的装饰器

TypeScript 装饰器是一种特殊的语法,它可以用来修改类、方法、属性或参数的行为。它们可以被认为是函数,它们接收一个参数,该参数是装饰器应用的目标。在本文中,我们将深入探讨 TypeScript 装饰器的不同类型、如何使用它们以及每个参数的含义。

一、装饰器的类型

TypeScript 支持以下四种装饰器类型:

  1. 类装饰器

类装饰器是应用于类构造函数的函数。它们可以用来修改类的行为。类装饰器在类被声明时被调用,可以用来修改类的结构或元数据。

  1. 方法装饰器

方法装饰器是应用于类方法的函数。它们可以用来修改类方法的行为。方法装饰器在方法被声明时被调用,可以用来修改方法的结构或元数据。

  1. 属性装饰器

属性装饰器是应用于类属性的函数。它们可以用来修改类属性的行为。属性装饰器在属性被声明时被调用,可以用来修改属性的结构或元数据。

  1. 参数装饰器

参数装饰器是应用于函数参数的函数。它们可以用来修改函数参数的行为。参数装饰器在函数被声明时被调用,可以用来修改参数的结构或元数据。

二、如何使用装饰器

使用 TypeScript 装饰器非常简单。只需在要装饰的目标前面添加 @ 符号,后面跟着装饰器函数即可。以下是一个使用类装饰器的示例:

@logClass
class MyClass {
  constructor() {
    console.log('MyClass constructor');
  }
}

function logClass(target: any) {
  console.log(target);
}

在这个示例中,我们使用 @logClass 装饰器来装饰 MyClass 类。logClass 函数是我们自己定义的类装饰器函数。它接收一个参数,该参数是 MyClass 类的构造函数。

当我们运行这个示例时,我们将看到以下输出:

[Function: MyClass]
MyClass constructor

这表明 logClass 装饰器已成功应用于 MyClass 类。

三、装饰器参数的含义

装饰器函数可以接收不同类型的参数。以下是每种装饰器的参数以及它们的含义。

  1. 类装饰器参数

类装饰器可以接收一个参数:

function logClass(target: any) {
  console.log(target);
}

在这个示例中,target 参数是 MyClass 类的构造函数。您可以使用 target 参数来修改类的结构或元数据。

  1. 方法装饰器参数

方法装饰器可以接收三个参数:

function logMethod(target: any, methodName: string, descriptor: PropertyDescriptor) {
  console.log(target);
  console.log(methodName);
  console.log(descriptor);
}

在这个示例中,target 参数是 MyClass 类的原型对象,methodName 参数是要装饰的方法的名称,descriptor 参数是一个属性描述符对象,它描述了要装饰的方法的属性。

您可以使用这些参数来修改方法的结构或元数据。

  1. 属性装饰器参数

属性装饰器可以接收两个参数:

function logProperty(target: any, propertyName: string) {
  console.log(target);
  console.log(propertyName);
}

在这个示例中,target 参数是 MyClass 类的原型对象,propertyName 参数是要装饰的属性的名称。

您可以使用这些参数来修改属性的结构或元数据。

  1. 参数装饰器参数

参数装饰器可以接收三个参数:

function logParameter(target: any, methodName: string, parameterIndex: number) {
  console.log(target);
  console.log(methodName);
  console.log(parameterIndex);
}

在这个示例中,target 参数是 MyClass 类的原型对象,methodName 参数是要装饰的方法的名称,parameterIndex 参数是要装饰的参数的索引。

您可以使用这些参数来修改参数的结构或元数据。

四、示例代码

以下是一个完整的 TypeScript 装饰器示例,它演示了如何使用不同类型的装饰器以及如何使用装饰器参数:

@logClass
class MyClass {
  @logProperty
  public myProperty: string;

  constructor() {
    console.log('MyClass constructor');
  }

  @logMethod
  public myMethod(@logParameter arg1: string, arg2: number): void {
    console.log('MyClass myMethod');
  }
}

function logClass(target: any) {
  console.log(target);
}

function logProperty(target: any, propertyName: string) {
  console.log(target);
  console.log(propertyName);
}

function logMethod(target: any, methodName: string, descriptor: PropertyDescriptor) {
  console.log(target);
  console.log(methodName);
  console.log(descriptor);
}

function logParameter(target: any, methodName: string, parameterIndex: number) {
  console.log(target);
  console.log(methodName);
  console.log(parameterIndex);
}

在这个示例中,我们定义了一个 MyClass 类,并应用了不同类型的装饰器。我们还定义了装饰器函数,这些函数接收不同类型的参数。

当我们运行这个示例时,我们将看到以下输出:

[Function: MyClass]
MyClass constructor
{ myProperty: undefined }
myProperty
[Function: MyClass]
myMethod
{ value: [Function: myMethod],
  writable: true,
  enumerable: true,
  configurable: true }
[Function: MyClass]
myMethod
0

这表明我们的装饰器已成功应用于 MyClass 类及其属性和方法。

五、总结

TypeScript 装饰器是一个强大的工具,它可以用来修改类、方法、属性或参数的行为。它们可以被认为是函数,它们接收一个参数,该参数是装饰器应用的目标。在本文中,我们深入探讨了 TypeScript 装饰器的不同类型、如何使用它们以及每个参数的含义。我们还提供了一个完整的示例代码,以演示如何使用不同类型的装饰器。

你可能感兴趣的:(学习nestjs 浅聊一下ts 的装饰器)