编辑
2023-03-26
TypeScript
0
请注意,本文编写于 571 天前,最后修改于 555 天前,其中某些信息可能已经过时。

目录

访问器装饰器
说明
注意
访问器装饰器被调用时
EG
属性装饰器
说明
EG
参数装饰器
说明
注意点
Eg

访问器装饰器

说明

紧接着访问器声明, 访问器装饰器应用于访问器的属性描述符并且可以用来监视,修改或替换一个访问器的定义
访问器装饰器不能用在声明文件中(.d.ts),或者任何外部上下文(比如 declare的类)里

注意

TS不允许同时装饰一个成员的get和set访问器。取而代之的是,一个成员的所有装饰的必须应用在文档顺序的第一个访问器上。这是因为,在装饰器应用于一个属性描述符时,它联合了get和set访问器,而不是分开声明的

访问器装饰器被调用时

访问器装饰器表达式会在运行时当作函数被调用,传入下列3个参数:

  • 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
  • 成员的名字
  • 成员的属性描述符

EG

ts
function 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个参数:

  • 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
  • 成员的名字

EG

ts
function 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个参数:

  • 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
  • 成员的名字
  • 参数在函数参数列表中的索引

注意点

  • 参数装饰器只能用来监视一个方法的参数是否被传入
  • 参数装饰器的返回值会被忽略

Eg

ts
import "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 许可协议。转载请注明出处!