类装饰器
function setName() {
console.log("get setName");
return (target: any) => {
console.log("setName");
};
}
function setAge() {
console.log("get setAge");
return (target: any) => {
console.log("setAge");
};
}
function setClass(target: any) {
console.log("setClass");
}
@setName()
@setAge()
@setClass
class ClassDec {
constructor(public name: string) {
this.name = "123";
}
}
方法装饰器
- target: any 修饰的对象
- propertyName: string 被修饰方法的名字
- descriptor: PropertyDescriptor 一个对象,被修饰方法的属性描述符
function enumerable(bool: boolean) {
return (target: any, propertyName: string, descriptor: PropertyDescriptor) => {
console.log(target, propertyName, descriptor);
descriptor.enumerable = bool;
};
}
class ClassObj {
constructor(public age: number) {}
@enumerable(true)
public getAge() {
return this.age;
}
}
const classObj = new ClassObj(18);
for (const key in classObj) {
if (key) {
console.log(key);
}
}
访问器装饰器
class ClassObj1 {
private _name: number;
constructor(name: number) {
this._name = name;
}
@enumerable(true)
get name() {
return this._name;
}
set name(name) {
this._name = name;
}
}
属性装饰器
- target: 修饰的目标
- propertyName: 被修饰的属性名
function printPropertyName(target: any, propertyName: string) {
console.log("属性装饰器:", propertyName);
}
class ClassObj2 {
@printPropertyName
public name: string;
constructor(name: string) {
this.name = name;
}
}
参数修饰器
- target: 当前的类
- propertyName: 被修饰参数对应的方法名
- index: 被修饰参数的下标
function required(target: any, propertyName: string, index: number) {
console.log(`修饰的是${propertyName}的第${index + 1}个参数`);
}
class ClassObj3 {
public getInfo(prefix: string, @required infoType: string): any {
return prefix + " " + infoType;
}
}
interface ClassObj4 {
[key: string]: string | number;
}
const classObj4 = new ClassObj3();
classObj4.getInfo("hi:", "age");