TypeScript系列教程十一《装饰器》 -- 参数装饰器

2022-05-06 17:21:24 浏览数 (1)

系列教程

  • TypeScript系列教程一《开篇》
  • TypeScript系列教程二《安装起步》
  • TypeScript系列教程三《基础类型》
  • TypeScript系列教程四《扩展类型》
  • TypeScript系列教程五《对象类型》》
  • TypeScript系列教程六《泛型》
  • TypeScript系列教程七《接口》
  • TypeScript系列教程八《类》
  • TypeScript系列教程九《高级类型》
  • TypeScript系列教程九《类型转换》-- keyof和typeof 操作
  • TypeScript系列教程九《类型转换》-- 索引访问类型
  • TypeScript系列教程九《类型转换》-- 条件类型
  • TypeScript系列教程九《类型转换》-- 映射类型
  • TypeScript系列教程九《类型转换》-- 条件类型
  • TypeScript系列教程九《类型转换》-- 模板文本类型
  • TypeScript系列教程十《模块》
  • TypeScript系列教程十一《装饰器》 – 装饰器与继承
  • TypeScript系列教程十一《装饰器》 – 类装饰器
  • TypeScript系列教程十一《装饰器》 – 方法装饰器
  • TypeScript系列教程十一《装饰器》 – reflect-metadata
  • TypeScript系列教程十一《装饰器》 – 属性装饰器
  • TypeScript系列教程十一《装饰器》 – 参数装饰器

参数装饰器修饰函数参数,一般应用场景配合方法装饰器一起,达到检查参数的目的。

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

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

下面通过例子具体查看。

代码示例

示例目的:

根绝参数器找到返回的值,然后利用方法装饰器返回处理后的结果。

代码思路

  1. 根据参数装饰器标识
  2. 通过reflect-metadata 将数据记载到方法元数据,然后传递到方法装饰器
  3. 方法装饰器调用原有方法返回值

代码实现

代码语言:javascript复制
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'})

打印结果

0 人点赞