推荐答案
装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、属性或参数上,以修改它们的行为。装饰器使用 @expression 的形式,其中 expression 必须是一个函数,它会在运行时被调用,并传入有关装饰目标的信息。
类装饰器
类装饰器应用于类的构造函数,可以用来观察、修改或替换类定义。
// www.javascriptcn.com code example
function classDecorator<T extends {new(...args: any[]): {}}>(constructor: T) {
return class extends constructor {
newProperty = "new property";
hello = "override";
}
}
@classDecorator
class Greeter {
property = "property";
hello: string;
constructor(m: string) {
this.hello = m;
}
}
console.log(new Greeter("world"));方法装饰器
方法装饰器应用于方法的属性描述符,可以用来观察、修改或替换方法定义。
// www.javascriptcn.com code example
function methodDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(target);
console.log(propertyKey);
console.log(descriptor);
}
class Greeter {
@methodDecorator
greet() {
console.log("Hello, world!");
}
}属性装饰器
属性装饰器应用于类的属性,可以用来观察、修改或替换属性定义。
// www.javascriptcn.com code example
function propertyDecorator(target: any, propertyKey: string) {
console.log(target);
console.log(propertyKey);
}
class Greeter {
@propertyDecorator
greeting: string;
}参数装饰器
参数装饰器应用于方法的参数,可以用来观察、修改或替换参数定义。
// www.javascriptcn.com code example
function parameterDecorator(target: any, propertyKey: string, parameterIndex: number) {
console.log(target);
console.log(propertyKey);
console.log(parameterIndex);
}
class Greeter {
greet(@parameterDecorator message: string) {
console.log(message);
}
}本题详细解读
装饰器是 TypeScript 中的一种高级特性,它允许你在不修改类、方法、属性或参数本身的情况下,通过装饰器函数来修改它们的行为。装饰器本质上是一个函数,它会在运行时被调用,并传入有关装饰目标的信息。
类装饰器
类装饰器接收一个参数,即类的构造函数。通过返回一个新的类,你可以扩展或修改原始类的行为。在上面的例子中,classDecorator 装饰器扩展了 Greeter 类,添加了一个新的属性和覆盖了 hello 属性。
方法装饰器
方法装饰器接收三个参数:目标对象、方法名和属性描述符。你可以通过修改属性描述符来改变方法的行为。在上面的例子中,methodDecorator 装饰器打印了目标对象、方法名和属性描述符。
属性装饰器
属性装饰器接收两个参数:目标对象和属性名。你可以通过这个装饰器来观察或修改属性的行为。在上面的例子中,propertyDecorator 装饰器打印了目标对象和属性名。
参数装饰器
参数装饰器接收三个参数:目标对象、方法名和参数索引。你可以通过这个装饰器来观察或修改参数的行为。在上面的例子中,parameterDecorator 装饰器打印了目标对象、方法名和参数索引。
通过这些装饰器,你可以在不修改原始代码的情况下,灵活地扩展和修改类、方法、属性和参数的行为。