reflect-metadata示例:import'reflect-metadata';函数验证(目标:对象,键:字符串,描述符:PropertyDescriptor){constoriginalFn=descriptor.value;//获取参数的编译时类型constdesignParamTypes=Reflect.getMetadata('design:paramtypes',target,key);descriptor.value=function(...args:any[]){args.forEach((arg,index)=>{constparamType=designParamTypes[index];constresult=arg.constructor===paramType||arginstanceofparamType;if(!result){thrownewError(`验证参数失败:索引的${arg}:${index}`);}});返回originalFn.call(this,...args);}}classC{@validatesayRepeat(word:string,x:number){returnArray(x).fill(word).join('');}}constc=newC();c.sayRepeat('你好',2);//passc.sayRepeat('','lol'asany);//throwanerror方法装饰器中包含的描述符的形状如下:通过反射API提取的方法参数为String和Number:Reflect.getMetadata的输入输出文件如下:可见我们自定义的validate函数在一定程度上模拟了TypeScript编译器的工作。即使开发人员调用sayRepeat方法,使用any方式绕过编译器的静态语法检查,在运行时,我们的@validate装饰器实现也会检测到这种违规行为。更多Jerry原创文章在这里:《王子熙》:
