为了账号安全,请及时绑定邮箱和手机立即绑定

【十月打卡】第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 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消