装饰器为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式
装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上。
装饰器使用 @expression
这种形式,expression
求值后必须为一个函数,它会在运行时被调用,被装饰的声明信息做为参数传入
function setProp(){
return function target(){
}
}
@setProp()
类中的装饰器的引用,参数装饰器、方法装饰器、访问符装饰器或者属性装饰器,应用到实例成员上
参数装饰器、方法装饰器、访问符装饰器、属性装饰器,应用到静态成员上
参数装饰器应用到构造函数上
类装饰器 应用到类上
类装饰器在类声明前声明,类修饰符应用于类的构造函数,可用于观察、修改或替换类定义。
类装饰器接收装饰类的构造函数作为唯一参数
如果类装饰器返回一个值,它将用提供的构造函数替换类声明。
function setName(name: string) {
return (target: new () => any) => {
sign = target;
}
}
@setName('lison')
class ClassDes {
constructor() {
}
}
方法修饰符在方法声明之前声明。修饰符应用于方法的属性描述符,可用于观察、修改或替换方法定义。
方法装饰器接收三个参数:
如果方法装饰器返回一个值,它将用作该方法的属性描述符。
function methodDecorator(target, propertyName,propertyDescriptor){
}
class Person {
name:string;
constructor(name:string){
this.name = name;
}
@methodDecorator
getName(){
return this.name;
}
}
在访问器声明之前声明。访问器修饰符应用于访问器的属性描述符,可用于观察、修改或替换访问器的定义。
访问者装饰器接收三个参数:
如果访问者装饰器返回一个值,它将用作成员得属性描述符
function getterDecorator(target, propertyName,propertyDescriptor){
}
class Person {
constructor(name:string){
this.name = name;
}
@getterDecorator
get name(){
return this.name;
}
}
在属性声明之前声明。
属性装饰器接收两个参数:
属性装饰器的返回值会被忽略。
function getterDecorator(target, propertyName,){
}
class Person {
@propertyDecorator
name:string
constructor(name:string){
this.name = name;
}
}
在参数声明之前声明了参数装饰器。参数修饰符应用于类构造函数或方法声明的函数。
参数装饰器接收三个参数:
参数装饰器的返回值会被忽略。
function paramsDecorator(target, propertyName,index){
}
class Person {
name:string
constructor(name:string){
this.name = name;
}
eat(@paramsDecorator food:string){
}
}