装饰器(Decorators)是一种特殊类型的声明,可以附加到类声明、方法、访问器、属性或参数上,来修饰这些声明。装饰器使用@expression这种语法,expression必须求值为一个函数,然后被应用到被修饰的声明上。装饰器是一种实验性特性,需要开启experimentalDecorators编译选项。

装饰器提供了一种更加灵活和可重用的方式来修改或扩展类的行为。在TypeScript中,装饰器可以分为类装饰器、方法装饰器、访问器装饰器、属性装饰器和参数装饰器。

类装饰器

类装饰器在类声明之前声明,用来修饰类的构造函数。类装饰器接收一个参数,即被修饰的类的构造函数。

function classDecorator(constructor: Function) {
    console.log('Class Decorator');
}

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

方法装饰器

方法装饰器用来修饰类的方法,可以拦截该方法的调用。方法装饰器接收三个参数,分别是目标对象、方法名和方法描述符。

function methodDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log('Method Decorator');
}

class MyClass {
    @methodDecorator
    myMethod() {
        console.log('My Method');
    }
}

访问器装饰器

访问器装饰器用来修饰类的访问器(getter和setter)。访问器装饰器接收三个参数,分别是目标对象、属性名和属性描述符。

function accessorDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log('Accessor Decorator');
}

class MyClass {
    private _value: number = 0;

    @accessorDecorator
    get value(): number {
        return this._value;
    }

    set value(value: number) {
        this._value = value;
    }
}

属性装饰器

属性装饰器用来修饰类的属性。属性装饰器接收两个参数,分别是目标对象和属性名。

function propertyDecorator(target: any, propertyKey: string) {
    console.log('Property Decorator');
}

class MyClass {
    @propertyDecorator
    myProperty: string = 'My Property';
}

参数装饰器

参数装饰器用来修饰类的构造函数参数或方法参数。参数装饰器接收三个参数,分别是目标对象、方法名或undefined(如果修饰的是构造函数参数)和参数在参数列表中的索引。

function parameterDecorator(target: any, propertyKey: string | symbol, parameterIndex: number) {
    console.log('Parameter Decorator');
}

class MyClass {
    myMethod(@parameterDecorator param1: string, @parameterDecorator param2: number) {
        console.log('My Method');
    }
}

以上是关于Typescript装饰器的基础教程,希望对你有所帮助。如果想更深入了解装饰器的用法和应用场景,可以查阅官方文档或相关教程。