日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

TypeScript 裝飾器實(shí)用指南!

來源: 責(zé)編: 時(shí)間:2023-08-09 23:03:20 376觀看
導(dǎo)讀一、裝飾器的概念 Summer IS HERE在 TypeScript 中,裝飾器就是可以添加到類及其成員的函數(shù)。TypeScript 裝飾器可以注釋和修改類聲明、方法、屬性和訪問器。Decorator類型定義如下:type Decorator = (target: Input, co

MKB28資訊網(wǎng)——每日最新資訊28at.com

一、裝飾器的概念 Summer IS HERE

在 TypeScript 中,裝飾器就是可以添加到類及其成員的函數(shù)。TypeScript 裝飾器可以注釋和修改類聲明、方法、屬性和訪問器。Decorator類型定義如下:MKB28資訊網(wǎng)——每日最新資訊28at.com

type Decorator = (target: Input, context: {  kind: string;  name: string | symbol;  access: {    get?(): unknown;    set?(value: unknown): void;  };  private?: boolean;  static?: boolean;  addInitializer?(initializer: () => void): void;}) => Output | void;

上面的類型定義解釋如下:MKB28資訊網(wǎng)——每日最新資訊28at.com

  • target:代表要裝飾的元素,其類型為 Input。
  • context 包含有關(guān)如何聲明修飾方法的元數(shù)據(jù),即:
  • kind:裝飾值的類型。正如我們將看到的,這可以是類、方法、getter、setter、字段或訪問器。
  • name:被裝飾對(duì)象的名稱。
  • access:引用 getter 和 setter 方法來訪問裝飾對(duì)象的對(duì)象。
  • private:被裝飾的對(duì)象是否是私有類成員。
  • static:被修飾的對(duì)象是否是靜態(tài)類成員。
  • addInitializer:一種在構(gòu)造函數(shù)開頭(或定義類時(shí))添加自定義初始化邏輯的方法。
  • Output:表示 Decorator 函數(shù)返回值的類型。

二、裝飾器的類型 Summer IS HERE

接下來,我們就來了解一下裝飾器的各種類型。MKB28資訊網(wǎng)——每日最新資訊28at.com

Summer:類裝飾器

當(dāng)將函數(shù)作為裝飾器附加到類時(shí),將收到類構(gòu)造函數(shù)作為第一個(gè)參數(shù):MKB28資訊網(wǎng)——每日最新資訊28at.com

type ClassDecorator = (value: Function, context: {  kind: "class"  name: string | undefined  addInitializer(initializer: () => void): void}) => Function | void

例如,假設(shè)想要使用裝飾器向 Rocket 類添加兩個(gè)屬性:fuel 和 isEmpty()。在這種情況下,可以編寫以下函數(shù):MKB28資訊網(wǎng)——每日最新資訊28at.com

function WithFuel(target: typeof Rocket, context): typeof Rocket {  if (context.kind === "class") {    return class extends target {      fuel: number = 50      isEmpty(): boolean {        return this.fuel == 0      }    }  }}

在確保裝飾元素的類型確實(shí)是類之后,返回一個(gè)具有兩個(gè)附加屬性的新類。或者,可以使用原型對(duì)象來動(dòng)態(tài)添加新方法:MKB28資訊網(wǎng)——每日最新資訊28at.com

function WithFuel(target: typeof Rocket, context): typeof Rocket {  if (context.kind === "class") {    target.prototype.fuel = 50    target.prototype.isEmpty = (): boolean => {      return this.fuel == 0    }  }}

可以按以下方式使用 WithFuel:MKB28資訊網(wǎng)——每日最新資訊28at.com

@WithFuelclass Rocket {}const rocket = new Rocket()console.log((rocket as any).fuel)console.log(`empty? ${(rocket as any).isEmpty()}`)/* Prints:50empty? false*/

可以看到,這里將rocket轉(zhuǎn)換為any類型才能訪問新的屬性。這是因?yàn)檠b飾器無法影響類型的結(jié)構(gòu)。MKB28資訊網(wǎng)——每日最新資訊28at.com

如果原始類定義了一個(gè)稍后被裝飾的屬性,裝飾器會(huì)覆蓋原始值。例如,如果Rocket有一個(gè)具有不同值的fuel屬性,WithFuel裝飾器將會(huì)覆蓋該值:MKB28資訊網(wǎng)——每日最新資訊28at.com

function WithFuel(target: typeof Rocket, context): typeof Rocket {  if (context.kind === "class") {    return class extends target {      fuel: number = 50      isEmpty(): boolean {        return this.fuel == 0      }    }  }}@WithFuelclass Rocket {  fuel: number = 75}const rocket = new Rocket()console.log((rocket as any).fuel)// 50

Summer:方法裝飾器

方法裝飾器可以用于裝飾類方法。在這種情況下,裝飾器函數(shù)的類型如下:MKB28資訊網(wǎng)——每日最新資訊28at.com

type ClassMethodDecorator = (target: Function, context: {  kind: "method"  name: string | symbol  access: { get(): unknown }  static: boolean  private: boolean  addInitializer(initializer: () => void): void}) => Function | void

如果希望在調(diào)用被裝飾的方法之前或之后執(zhí)行某些操作時(shí),就可以使用方法裝飾器。MKB28資訊網(wǎng)——每日最新資訊28at.com

例如,在開發(fā)過程中,記錄對(duì)特定方法的調(diào)用或在調(diào)用之前/之后驗(yàn)證前置/后置條件可能非常有用。此外,我們還可以影響方法的調(diào)用方式,例如通過延遲其執(zhí)行或限制在一定時(shí)間內(nèi)的調(diào)用次數(shù)。MKB28資訊網(wǎng)——每日最新資訊28at.com

最后,可以使用方法裝飾器將一個(gè)方法標(biāo)記為已廢棄,并記錄一條消息來警告用戶,并告知他們應(yīng)該使用哪個(gè)方法代替:MKB28資訊網(wǎng)——每日最新資訊28at.com

function deprecatedMethod(target: Function, context) {  if (context.kind === "method") {    return function (...args: any[]) {      console.log(`${context.name} is deprecated and will be removed in a future version.`)      return target.apply(this, args)    }  }}

在這種情況下,deprecatedMethod函數(shù)的第一個(gè)參數(shù)是要裝飾的方法。確認(rèn)它確實(shí)是一個(gè)方法后(context.kind === "method"),返回一個(gè)新的函數(shù),該函數(shù)在調(diào)用實(shí)際方法之前包裝被裝飾的方法并記錄一條警告消息。MKB28資訊網(wǎng)——每日最新資訊28at.com

接下來,可以按照以下方式使用裝飾器:MKB28資訊網(wǎng)——每日最新資訊28at.com

@WithFuelclass Rocket {  fuel: number = 75  @deprecatedMethod  isReadyForLaunch(): Boolean {    return !(this as any).isEmpty()  }}const rocket = new Rocket()console.log(`Is ready for launch? ${rocket.isReadyForLaunch()}`)

在isReadyForLaunch()方法中,引用了通過WithFuel裝飾器添加的isEmpty方法。注意,必須將其轉(zhuǎn)換為any類型的實(shí)例,與之前一樣。當(dāng)調(diào)用isReadyForLaunch()方法時(shí),會(huì)看到以下輸出,顯示警告消息被正確地打印出來:MKB28資訊網(wǎng)——每日最新資訊28at.com

isReadyForLaunch is deprecated and will be removed in a future version.Is the ready for launch? true

Summer:屬性裝飾器

屬性裝飾器與方法裝飾器的類型非常相似:MKB28資訊網(wǎng)——每日最新資訊28at.com

type ClassPropertyDecorator = (target: undefined, context: {  kind: "field"  name: string | symbol  access: { get(): unknown, set(value: unknown): void }  static: boolean  private: boolean}) => (initialValue: unknown) => unknown | void

屬性裝飾器的用例與方法裝飾器的用法也非常相似。例如,可以跟蹤對(duì)屬性的訪問或?qū)⑵錁?biāo)記為已棄用:MKB28資訊網(wǎng)——每日最新資訊28at.com

function deprecatedProperty(_: any, context) {  if (context.kind === "field") {    return function (initialValue: any) {      console.log(`${context.name} is deprecated and will be removed in a future version.`)      return initialValue    }  }}

代碼與為方法定義的 deprecatedMethod 裝飾器非常相似,它的用法也是如此。MKB28資訊網(wǎng)——每日最新資訊28at.com

Summer:訪問器裝飾器

與方法裝飾器非常相似的是訪問器裝飾器,它是針對(duì) getter 和 setter 的裝飾器:MKB28資訊網(wǎng)——每日最新資訊28at.com

type ClassSetterDecorator = (target: Function, context: {  kind: "setter"  name: string | symbol  access: { set(value: unknown): void }  static: boolean  private: boolean  addInitializer(initializer: () => void): void}) => Function | voidtype ClassGetterDecorator = (value: Function, context: {  kind: "getter"  name: string | symbol  access: { get(): unknown }  static: boolean  private: boolean  addInitializer(initializer: () => void): void}) => Function | void

訪問器裝飾器的定義與方法裝飾器的定義類似。例如,可以將 deprecatedMethod 和 deprecatedProperty 修飾合并到一個(gè)已棄用的函數(shù)中,該函數(shù)也支持 getter 和 setter:MKB28資訊網(wǎng)——每日最新資訊28at.com

function deprecated(target, context) {  const kind = context.kind  const msg = `${context.name} is deprecated and will be removed in a future version.`  if (kind === "method" || kind === "getter" || kind === "setter") {    return function (...args: any[]) {      console.log(msg)      return target.apply(this, args)    }  } else if (kind === "field") {    return function (initialValue: any) {      console.log(msg)      return initialValue    }  }}

三、裝飾器的用例 Summer IS HERE

上面介紹了裝飾器是什么以及如何正確使用它們,下面來看看裝飾器可以幫助我們解決的一些具體問題。MKB28資訊網(wǎng)——每日最新資訊28at.com

Summer:計(jì)算執(zhí)行時(shí)間

假設(shè)想要估計(jì)運(yùn)行一個(gè)函數(shù)需要多長時(shí)間,以此來衡量應(yīng)用的性能。可以創(chuàng)建一個(gè)裝飾器來計(jì)算方法的執(zhí)行時(shí)間并將其打印在控制臺(tái)上:MKB28資訊網(wǎng)——每日最新資訊28at.com

class Rocket {  @measure  launch() {    console.log("3... 2... 1...  
                

本文鏈接:http://m.www897cc.com/showinfo-26-5177-0.htmlTypeScript 裝飾器實(shí)用指南!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 六款開源、免費(fèi)的簡(jiǎn)歷制作神器,程序員必備!

下一篇: CSS 漸變中的顏色空間和色相插值

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場(chǎng)的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號(hào)為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號(hào)的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 7月安卓手機(jī)好評(píng)榜:三星S23Ultra好評(píng)率第一

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來源安兔兔評(píng)測(cè),收集時(shí)間2023年7月1日至7月31日,僅限國內(nèi)市場(chǎng)。第一名:三星Galaxy S23 Ultra好評(píng)率:95.71%在即將迎來新
  • 28個(gè)SpringBoot項(xiàng)目中常用注解,日常開發(fā)、求職面試不再懵圈

    前言在使用SpringBoot開發(fā)中或者在求職面試中都會(huì)使用到很多注解或者問到注解相關(guān)的知識(shí)。本文主要對(duì)一些常用的注解進(jìn)行了總結(jié),同時(shí)也會(huì)舉出具體例子,供大家學(xué)習(xí)和參考。注解
  • 不容錯(cuò)過的MSBuild技巧,必備用法詳解和實(shí)踐指南

    一、MSBuild簡(jiǎn)介MSBuild是一種基于XML的構(gòu)建引擎,用于在.NET Framework和.NET Core應(yīng)用程序中自動(dòng)化構(gòu)建過程。它是Visual Studio的構(gòu)建引擎,可在命令行或其他構(gòu)建工具中使用
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個(gè)大新聞是Meta AI推出了新的開源授權(quán)的大型語言模型Llama 2。這是一項(xiàng)非常重要的進(jìn)展:Llama 2可免費(fèi)用于研究和商業(yè)用途。(幾小時(shí)前,swyy發(fā)現(xiàn)它已從LLaMA 2更名為Lla
  • 2023年,我眼中的字節(jié)跳動(dòng)

    此時(shí)此刻(2023年7月),字節(jié)跳動(dòng)從未上市,也從未公布過任何官方的上市計(jì)劃;但是這并不妨礙它成為中國最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強(qiáng)勢(shì)崛起,到2018年的“頭騰
  • 猿輔導(dǎo)與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對(duì)“勢(shì)”的把握,這其中最關(guān)鍵的當(dāng)屬對(duì)企業(yè)戰(zhàn)略的制定,且能夠站在未來看現(xiàn)在,即使這其中的
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯(lián)網(wǎng)品牌官01 擦邊少女空降熱搜,幕后推手曝光被網(wǎng)友譽(yù)為“純欲天花板”的女網(wǎng)紅井川里予,近期因?yàn)橐唤M哥特風(fēng)照片登上熱搜,引發(fā)了一場(chǎng)互聯(lián)網(wǎng)世界關(guān)于
  • 馮提莫簽約抖音公會(huì) 前“斗魚一姐”消失在直播間

    來源:直播觀察提起“馮提莫”這個(gè)名字,很多網(wǎng)友或許聽過,但應(yīng)該不記得她是哪位主播了。其實(shí),作為曾經(jīng)的“斗魚一姐”,馮提莫在游戲直播的年代影響力不輸于現(xiàn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲一区二区三区在线观看视频 | 国产亚洲网站| 国产精品羞羞答答| 国产偷国产偷亚洲高清97cao| 狠狠综合久久av一区二区老牛| 亚洲成色精品| 一本一本a久久| 欧美一区影院| 美腿丝袜亚洲色图| 国产精品v日韩精品| 国产欧美一区二区精品婷婷| 黄色一区二区三区| 亚洲最新在线| 久久九九热re6这里有精品| 欧美大片91| 国产精品有限公司| 亚洲国产成人久久| 亚洲欧美偷拍卡通变态| 久久琪琪电影院| 欧美日韩一区二区三区四区五区| 国产丝袜一区二区三区| 日韩视频三区| 久久精品国内一区二区三区| 欧美区国产区| 韩日午夜在线资源一区二区| 99re66热这里只有精品4| 欧美一区二区网站| 欧美日韩亚洲一区二区三区| 韩国av一区| 亚洲视频在线观看三级| 另类天堂av| 国产欧美精品在线播放| 亚洲精品欧美激情| 久久精品国产一区二区三区| 欧美体内she精视频在线观看| 一区在线播放| 校园春色国产精品| 欧美日韩精品一区二区三区| 黄色精品一区| 亚洲欧美一区二区激情| 欧美女同视频| 伊人男人综合视频网| 亚洲女优在线| 欧美日韩亚洲91| 亚洲欧洲日产国产网站| 欧美在线网站| 国产精品美女诱惑| 99re热这里只有精品视频| 老司机午夜精品视频| 国产日韩精品视频一区二区三区| 一本色道久久综合一区| 欧美成人精品在线观看| 激情另类综合| 欧美有码在线视频| 国产精品露脸自拍| 一区二区三区.www| 欧美黄色网络| 在线免费观看一区二区三区| 久久aⅴ国产欧美74aaa| 国产精品视频网| 中文精品在线| 欧美日韩一区二区三区在线看 | 欧美日韩一二区| 亚洲激情在线播放| 麻豆91精品91久久久的内涵| 国产一区二区在线免费观看| 午夜精品久久久久99热蜜桃导演| 欧美日韩一区二区三| 日韩视频免费观看| 欧美激情一区二区三区在线视频观看| 影音先锋亚洲视频| 久久先锋影音av| 经典三级久久| 久久综合狠狠| 在线免费观看视频一区| 久久久亚洲精品一区二区三区| 国产视频亚洲精品| 欧美一级视频精品观看| 亚洲欧美日韩综合国产aⅴ| 欧美日韩黄视频| 日韩亚洲国产欧美| 欧美日韩免费视频| 一区二区三区四区五区在线| 欧美日韩在线一区二区三区| 99在线精品观看| 欧美视频一区二区三区| 亚洲视频精选在线| 国产精品毛片在线| 午夜国产欧美理论在线播放 | 揄拍成人国产精品视频| 久久人人九九| 在线日韩精品视频| 欧美国产综合| 亚洲最新在线视频| 国产精品嫩草99a| 欧美一区二粉嫩精品国产一线天| 国产欧美日韩视频一区二区| 欧美专区在线播放| 激情视频一区二区| 欧美成人有码| 一级日韩一区在线观看| 欧美视频免费| 午夜精品免费在线| 国产一区二区中文| 美女精品自拍一二三四| 亚洲欧洲日本专区| 欧美日韩理论| 午夜视频一区| 国内精品美女在线观看| 麻豆精品网站| 99精品免费视频| 国产精品美女诱惑| 欧美专区日韩视频| 亚洲激情电影中文字幕| 欧美日韩亚洲视频| 香蕉精品999视频一区二区 | 亚洲电影第1页| 欧美日韩国产综合视频在线| 亚洲欧美综合| 在线播放一区| 欧美日韩免费在线视频| 欧美一级大片在线观看| 亚洲电影成人| 国产精品久久久久久av福利软件| 欧美综合国产| 亚洲免费观看| 国产亚洲欧美一区二区| 欧美极品一区| 欧美一级网站| 亚洲精品在线电影| 国产麻豆综合| 欧美精品福利| 欧美主播一区二区三区| 亚洲美女精品成人在线视频| 国产精品影音先锋| 欧美精品三区| 久久精品国产久精国产一老狼 | 国产精品99久久久久久久vr| 国产在线观看一区| 欧美日韩小视频| 久久婷婷亚洲| 一区二区91| 在线激情影院一区| 国产精品久久久久久久久搜平片| 久久在线免费观看| 亚洲一区二区三区精品在线| 狠狠v欧美v日韩v亚洲ⅴ| 欧美日韩一区二区视频在线| 久久精品一本久久99精品| 一本色道88久久加勒比精品| 国内外成人免费激情在线视频| 欧美日韩国产限制| 久久综合综合久久综合| 亚洲综合精品四区| 亚洲另类春色国产| 伊人狠狠色j香婷婷综合| 国产精品久久久久久久一区探花| 欧美69wwwcom| 久久精品国产一区二区三| 亚洲视频一区二区| 亚洲黄色小视频| 国产亚洲欧美色| 国产精品久久一卡二卡| 欧美国产免费| 久久人91精品久久久久久不卡 | 欧美视频在线看| 欧美大片在线观看一区| 久久国产日韩欧美| 亚洲欧美国产一区二区三区| 亚洲精品极品| 精品成人一区二区三区| 国产麻豆综合| 欧美午夜精品一区| 欧美精品一区二区三区很污很色的 | 亚洲男人第一网站| 一本色道久久88综合日韩精品| 亚洲国产经典视频| 亚洲欧美综合精品久久成人| 日韩午夜免费视频| 亚洲国产天堂久久国产91| 国语自产精品视频在线看一大j8| 国产精品私房写真福利视频| 欧美日韩国产影院| 欧美日本高清| 欧美电影在线观看完整版| 久久综合色88| 久久亚洲精品一区| 久久久久久综合网天天| 欧美在线播放视频| 亚洲欧美中文日韩v在线观看| 亚洲综合色网站| 亚洲一级黄色片| 在线视频亚洲一区| 一本大道av伊人久久综合| 亚洲免费观看在线观看| 亚洲毛片一区| 亚洲免费观看| 亚洲毛片在线观看.| 99v久久综合狠狠综合久久| 亚洲伦理中文字幕| 日韩亚洲国产欧美| 亚洲神马久久| 亚洲亚洲精品三区日韩精品在线视频| 99精品视频一区二区三区|