深入理解 TypeScript Reflect Metadata
在定义类或者类方法的时候,可以设置一些元数据,我们可以获取到在类与类方法上添加的元数据,用的方法就是ReflectMetadata。元数据指的是描述东西时用的数据。
在TypeScript里使用ReflectMetadata需要做下面这样的配置:
{ "compilerOptions":{ "experimentalDecorators":true, "emitDecoratorMetadata":true }, }
然后在项目里安装reflect-metadata这个包:
npminstallreflect-metadata--save
然后做个实验:
import'reflect-metadata'; @Reflect.metadata('role','admin') classPost{} constmetadata=Reflect.getMetadata('role',Post); console.log(metadata);//admin
先导入reflect-metadata这个包,然后在定义的Post类的上面用Reflect.metadata装饰器添加了一条元数据,role是这条元数据的名字,admin是我们给这条数据设置的对应的值。
稍后如果想获取到在类上添加的这些元数据,可以使用Reflect.getMetadata方法,role是元数据的名字,Post是对应的类的名字。执行上面代码,会返回admin这个字符串。
自定义装饰器
在上面的例子里我们用了Reflect.metadata设置的元数据。我们也可以自定义一个装饰器去完成同样的事情。像下面这样:
import'reflect-metadata'; functionRole(name:string):ClassDecorator{ returntarget=>{ Reflect.defineMetadata('role',name,target); }; } @Role('admin') classPost{} constmetadata=Reflect.getMetadata('role',Post); console.log(metadata);
Role是自定义的一个装饰器,接收一个name参数,这是一个装饰器工厂,返回的是ClassDecorator。返回的东西应该是个适合在类上使用的装饰器,所以接收一个target参数,这个东西就是类的构造方法。在方法里用Reflect.defineMetadata方法设置了一个自定义的元数据叫role,对应的值是name,也就是使用这个装饰器的时候提供的参数值,第三个参数是target,就是要添加元数据的那个类。
有了这个自定义的装饰器,使用它的时候可以像这样:@Role('admin'),功能就是在它装饰的类的上面添加了一条叫role的元数据,设置的对应的值是admin。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。