TypeScript 语言 装饰器 Decorator 基础语法

TypeScriptamuwap 发布于 2 天前 2 次阅读


TypeScript【1】 装饰器【2】基础语法详解

TypeScript 作为 JavaScript 的超集,提供了丰富的语言特性,其中装饰器(Decorators)是 TypeScript 中一个非常有用的特性。装饰器可以用来修饰类、方法、访问器、属性或参数,从而在不修改原有代码结构的情况下,为它们添加额外的功能。本文将围绕 TypeScript 装饰器的基础语法进行详细讲解。

装饰器概述

装饰器是一个接受目标函数或类作为参数的函数。装饰器可以用来扩展或修改目标函数或类的行为。在 TypeScript 中,装饰器通常用于以下场景:

- 修改类的行为
- 添加元数据【3】
- 生成代码
- 验证输入【4】

装饰器分为三类:

- 类装饰器【5】(Class Decorators)
- 方法装饰器【6】(Method Decorators)
- 属性装饰器【7】(Property Decorators)
- 参数装饰器【8】(Parameter Decorators)

类装饰器

类装饰器用于装饰类本身。它会在类的构造函数执行之前被调用。类装饰器的返回值可以用来修改类的行为。

typescript
function logClass(target: Function) {
console.log(`Class ${target.name} is decorated!`);
}

@logClass
class MyClass {
constructor() {
console.log('Constructor of MyClass is called.');
}
}

在上面的例子中,`logClass` 是一个类装饰器,它会在 `MyClass` 的构造函数执行之前被调用,并打印一条消息。

方法装饰器

方法装饰器用于装饰类的方法。它会在目标方法被定义之后、被调用之前被调用。方法装饰器的返回值可以用来修改方法的返回值。

typescript
function logMethod(target: Object, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Method ${propertyKey} is called with arguments:`, args);
return originalMethod.apply(this, args);
};
return descriptor;
}

class MyClass {
@logMethod
public myMethod(arg1: string, arg2: number) {
return `${arg1} and ${arg2}`;
}
}

在上面的例子中,`logMethod` 是一个方法装饰器,它会在 `myMethod` 方法被调用之前被调用,并打印出方法的调用信息。

属性装饰器

属性装饰器用于装饰类的属性。它会在属性被定义之后、被赋值之前被调用。属性装饰器的返回值可以用来修改属性的值。

typescript
function logProperty(target: Object, propertyKey: string) {
console.log(`Property ${propertyKey} is decorated!`);
}

class MyClass {
@logProperty
public myProperty: string;

constructor() {
this.myProperty = 'Hello, TypeScript!';
}
}

在上面的例子中,`logProperty` 是一个属性装饰器,它会在 `myProperty` 属性被赋值之前被调用,并打印出属性被装饰的信息。

参数装饰器

参数装饰器用于装饰类的方法参数。它会在目标方法被定义之后、被调用之前被调用。参数装饰器的返回值可以用来修改参数的值。

typescript
function logParameter(target: Object, propertyKey: string, parameterIndex: number) {
console.log(`Parameter ${parameterIndex} of method ${propertyKey} is decorated!`);
}

class MyClass {
@logParameter
public myMethod(arg1: string, arg2: number) {
return `${arg1} and ${arg2}`;
}
}

在上面的例子中,`logParameter` 是一个参数装饰器,它会在 `myMethod` 方法的参数被调用之前被调用,并打印出参数被装饰的信息。

装饰器组合

装饰器可以组合使用,以实现更复杂的逻辑。以下是一个组合装饰器【9】的例子:

typescript
function logClass(target: Function) {
console.log(`Class ${target.name} is decorated!`);
}

function logMethod(target: Object, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(`Method ${propertyKey} is decorated!`);
}

@logClass
class MyClass {
@logMethod
public myMethod(arg1: string, arg2: number) {
return `${arg1} and ${arg2}`;
}
}

在这个例子中,`MyClass` 和 `myMethod` 都被两个装饰器装饰了。

总结

TypeScript 装饰器是一种强大的特性,可以用来扩展和修改类、方法、属性和参数的行为。通过理解装饰器的基础语法,我们可以利用它们来实现各种高级功能,如日志记录【10】、验证、代码生成【11】等。本文详细介绍了 TypeScript 装饰器的基础语法,包括类装饰器、方法装饰器、属性装饰器和参数装饰器。希望这篇文章能帮助你更好地理解和使用 TypeScript 装饰器。