什么是元数据
简单的说就是对数据的额外的描述,例如:
const obj = {name: '哈哈哈'}
元数据就是对name进行额外的描述。
环境配置
默认情况下TypeScript是不支持元数据的。需要进行额外的配置。
通过下面的命令来安装一个第三方的包:
npm install reflect-metadata# 或者yarn add reflect-metadata
使用
下面是具体的一个示例,需要注意的是,需要先引入第三方的包:
import 'reflect-metadata';// 为数据设置元数据const userdata = {username: 'root',};// 设置元数据// Reflect.defineMetadata()方法参数,// 参数1: 描述信息的key// 参数2: 描述信息// 参数3: 操作的对象// 参数4: 针对的keyReflect.defineMetadata('haha',{ url: 'http://www.baidu.com' },userdata,'username');// 读取属性的描述console.log(Reflect.getMetadata('haha', userdata, 'username')); // { url: 'http://www.baidu.com' }
使用元数据来验证方法的参数
示例代码如下:
import 'reflect-metadata';// 使用参数装饰器 来进行数据验证// 设置装饰器 -- 分别设置参数装饰器和 方法装饰器const MethodDecorator: MethodDecorator = (target: object,propertyKey: string | symbol,descriptor: PropertyDescriptor) => {console.log('方法装饰器');// 当方法装饰器执行的时候,获取内容// console.log(Reflect.getMetadata('required', target, propertyKey));// 将原来的方法函数保存起来const method = descriptor.value;// 重新定义装饰器绑定的方法// 装饰器绑定的方法中传递的参数都会传入重新定义的函数中,可以通过arguments查询descriptor.value = function () {// 获取用来修饰的元数据,如果没有使用参数装饰器,则默认值为一个空的数组const requiredParams: number[] =Reflect.getMetadata('required', target, propertyKey) || [];requiredParams.forEach((index) => {// index 表示要操作的数据的索引// console.log('@@',index)if (index > arguments.length || arguments[index] === undefined) {// 如果传入的参数错误,则直接抛出一个错误throw new Error('请传入必要的参数');}});return method.apply(this, arguments);};};const ValidateDecorator: ParameterDecorator = (target: Object,propertyKey: string | symbol,parameterIndex: number) => {console.log('参数装饰器');// 将需要验证的参数压入到数组当中let requiredParams: number[] = [];requiredParams.push(parameterIndex);// 使用元数据将数组当做需要验证的参数的修饰Reflect.defineMetadata('required', requiredParams, target, propertyKey);};// 创建一个类class User {@MethodDecoratorfind(name: string, @ValidateDecorator id: number) {console.log(id);}}new User().find('root', 100);
