亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

【十月打卡】第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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消