TypeScript 语言 装饰器 Decorator 基础语法

TypeScript阿木 发布于 2025-05-28 9 次阅读


阿木博主一句话概括:深入浅出TypeScript【1】装饰器【2】:语法基础与实战应用

阿木博主为你简单介绍:
TypeScript装饰器是一种强大的特性,它允许开发者在不修改原有代码结构的情况下,对类、方法、属性等进行扩展和增强。本文将围绕TypeScript装饰器的基础语法,详细介绍其定义、使用方法以及在实际开发中的应用。

一、
随着前端技术的发展,TypeScript作为一种静态类型语言,因其良好的类型系统、丰富的API和良好的兼容性,受到了越来越多开发者的青睐。装饰器作为TypeScript的一个高级特性,为开发者提供了更加灵活和强大的编程方式。本文将围绕TypeScript装饰器的基础语法,展开详细讲解。

二、装饰器概述
装饰器是一种特殊类型的声明,它能够被附加到类声明、方法、访问符、属性或参数【3】上。装饰器的目的是在不修改原有代码结构的情况下,对代码进行扩展和增强。

三、装饰器的语法基础
1. 装饰器表达式【4】
装饰器表达式是装饰器函数【5】或类的一个引用。以下是一个装饰器表达式的示例:

typescript
function log(target: Function) {
console.log(target);
}

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

在上面的示例中,`log`函数是一个装饰器,它接收一个目标对象`target`作为参数。`@log`语法表示将`log`装饰器应用到`MyClass`类上。

2. 装饰器函数
装饰器函数是一个接受目标对象作为参数的函数。以下是一个装饰器函数的示例:

typescript
function log(target: Function) {
console.log(target);
}

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

在上面的示例中,`log`函数是一个装饰器函数,它会在`MyClass`类被创建时被调用。

3. 装饰器类【6】
装饰器类是一个包含构造函数的类,它可以在构造函数中接收参数。以下是一个装饰器类的示例:

typescript
function log(target: Function) {
console.log(target);
}

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

在上面的示例中,`log`装饰器是一个类,它会在`MyClass`类被创建时被实例化。

四、装饰器的参数
装饰器可以接收参数,这些参数可以在装饰器函数或装饰器类的构造函数中使用。以下是一个带有参数的装饰器示例:

typescript
function log(target: Function, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(target);
console.log(propertyKey);
console.log(descriptor);
}

@log
class MyClass {
@log
public myMethod() {
console.log('MyMethod called');
}
}

在上面的示例中,`log`装饰器接收三个参数:目标对象`target`、属性键`propertyKey`和属性描述符【7】`descriptor`。

五、装饰器的应用场景
1. 类装饰器【8】
类装饰器可以用来修改类的行为,例如添加新的属性、方法或修改现有属性和方法。

typescript
function classDecorator(target: Function) {
target.prototype.newProperty = 'new property';
target.prototype.newMethod = function() {
return 'new method';
};
}

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

2. 方法装饰器【9】
方法装饰器可以用来修改方法的行为,例如添加日志、性能监控【10】等。

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

class MyClass {
@logMethod
public myMethod() {
console.log('MyMethod called');
}
}

3. 属性装饰器【11】
属性装饰器可以用来修改类的属性,例如添加验证逻辑【12】

typescript
function validate(target: Object, propertyKey: string) {
const descriptor: PropertyDescriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
descriptor.value = function(value: any) {
if (value < 0) {
throw new Error('Value must be greater than or equal to 0');
}
return value;
};
Object.defineProperty(target, propertyKey, descriptor);
}

class MyClass {
@validate
public myProperty: number;
}

六、总结
TypeScript装饰器是一种强大的特性,它为开发者提供了灵活的编程方式。相信读者已经对TypeScript装饰器的基础语法有了深入的了解。在实际开发中,装饰器可以用来实现日志记录【13】、性能监控、验证逻辑等功能,极大地提高了代码的可维护性【14】和可扩展性【15】

(注:本文仅为示例性介绍,实际应用中装饰器的使用会更加复杂和多样化。)