【十月打卡】第64天 TypeScript(20)
标签:
Typescript
reflect-metadata
Reflect Metadata 是 ES7 的一个提案,它主要用来在声明的时候添加和读取元数据。
我们想要使用这个功能,可以安装reflect-metadata
// 安装
npm i reflect-metadata --save
// 引入
import 'reflect-metadata'
API用法
namespace Reflect {
// 用于装饰器
metadata(k, v): (target, property?) => void
// 在对象上面定义元数据
defineMetadata(k, v, o, p?): void
// 是否存在元数据
hasMetadata(k, o, p?): boolean
hasOwnMetadata(k, o, p?): boolean
// 获取元数据
getMetadata(k, o, p?): any
getOwnMetadata(k, o, p?): any
// 获取所有元数据的 Key
getMetadataKeys(o, p?): any[]
getOwnMetadataKeys(o, p?): any[]
// 删除元数据
deleteMetadata(k, o, p?): boolean
}
示例
class Test {
getName() {}
}
class Teacher extends Test {}
Reflect.defineMetadata('name', '小明', Test);
const isExist = Reflect.hasMetadata('name', Teacher); // true
const isExist1 = Reflect.hasOwnMetadata('name', Teacher); // false
const res = Reflect.getMetadata('name', Teacher); // 小明
const res1 = Reflect.getOwnMetadata('name', Teacher); // undefined
- hasMetadata、getMetadata、getMetadataKeys 会沿着原型链查找
- hasOwnMetadata、getOwnMetadata、getOwnMetadataKeys 不会沿着原型链查找,只获取当前
应用在装饰器上
如果在装饰器上使用需要metadata
class Test {
@Reflect.metadata('age', 15)
getAge() {}
}
const isExist = Reflect.hasMetadata('age', Test.prototype, 'getAge');
const res = Reflect.getMetadata('age', Test.prototype, 'getAge');
装饰器的执行顺序
function showData(target: typeof User) {
const data = Reflect.getMetadata('name', target.prototype, 'getName');
console.log(data); // '小明'
}
@showData
class User {
@Reflect.metadata('name', '小明')
getName() {}
}
上述示例data可以打印出来,表示方法上的装饰器先执行,类的装饰器后执行
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦