紧接着访问器声明,
访问器装饰器应用于访问器的属性描述符并且可以用来监视,修改或替换一个访问器的定义
访问器装饰器不能用在声明文件中(.d.ts),或者任何外部上下文(比如 declare的类)里
TS不允许同时装饰一个成员的get和set访问器。取而代之的是,一个成员的所有装饰的必须应用在文档顺序的第一个访问器上。这是因为,在装饰器应用于一个属性描述符时,它联合了get和set访问器,而不是分开声明的
访问器装饰器表达式会在运行时当作函数被调用,传入下列3个参数:
tsfunction configurable(value: boolean) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(target)
console.log(target===Point.prototype)// true
descriptor.configurable = value;
};
}
class Point {
private _x: number;
private _y: number;
constructor(x: number, y: number) {
this._x = x;
this._y = y;
}
@configurable(false)
get x() { return this._x; }
@configurable(false)
get y() { return this._y; }
}
let target = new Point(2,3);
console.log(target.x) // 2
console.log(target.y) // 3
紧接着属性声明
属性描述符只能用来监视类中是否声明了某个名字的属性
属性装饰器表达式会在运行时当作函数被调用,传入下列2个参数:
tsfunction EngelCoefficient(foodsMoney:number,allMoney:number){
return function(target:any,key:string):any {
target.engel = foodsMoney/allMoney
}
}
class engel {
@EngelCoefficient(1200,800)
engel?:number
constructor(){
}
getEngel(){
return this.engel
}
}
let p = new engel()
console.log(p.getEngel()) // 1.5
紧接着参数声明
参数装饰器应用于类构造函数或方法声明
参数装饰器表达式会在运行时当作函数被调用,传入下列3个参数:
tsimport "reflect-metadata";
const response: ParameterDecorator = (
target: Object,
propertyKey: string | symbol,
parameterIndex: number
) => {
Reflect.defineMetadata("response", parameterIndex, target, propertyKey);
};
const get: (path: string) => MethodDecorator = (path) => {
return (
target: Object,
propertyKey: string | symbol,
descriptor: PropertyDescriptor
) => {
let originMethod = descriptor.value;
let index = Reflect.getMetadata("response", target,propertyKey);
descriptor.value = function () {
arguments[index] = {'data':'返回值'}
let arr = []
for (const eindex in arguments) {
if (Object.prototype.hasOwnProperty.call(arguments, eindex)) {
const element = arguments[eindex];
arr.push(element)
}
}
originMethod(...arr)
};
};
};
class HttpReq {
@get("/getAllData")
getAllData(request: {}, @response res?:{}) {
console.log(res);
}
}
let http = new HttpReq()
http.getAllData({'data':'requestBody'})
本文作者:RKLS
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!