国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

TypeScript 裝飾器實用指南!

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

JkP28資訊網——每日最新資訊28at.com

一、裝飾器的概念 Summer IS HERE

在 TypeScript 中,裝飾器就是可以添加到類及其成員的函數。TypeScript 裝飾器可以注釋和修改類聲明、方法、屬性和訪問器。Decorator類型定義如下:JkP28資訊網——每日最新資訊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;

上面的類型定義解釋如下:JkP28資訊網——每日最新資訊28at.com

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

二、裝飾器的類型 Summer IS HERE

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

Summer:類裝飾器

當將函數作為裝飾器附加到類時,將收到類構造函數作為第一個參數:JkP28資訊網——每日最新資訊28at.com

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

例如,假設想要使用裝飾器向 Rocket 類添加兩個屬性:fuel 和 isEmpty()。在這種情況下,可以編寫以下函數:JkP28資訊網——每日最新資訊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      }    }  }}

在確保裝飾元素的類型確實是類之后,返回一個具有兩個附加屬性的新類。或者,可以使用原型對象來動態(tài)添加新方法:JkP28資訊網——每日最新資訊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:JkP28資訊網——每日最新資訊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轉換為any類型才能訪問新的屬性。這是因為裝飾器無法影響類型的結構。JkP28資訊網——每日最新資訊28at.com

如果原始類定義了一個稍后被裝飾的屬性,裝飾器會覆蓋原始值。例如,如果Rocket有一個具有不同值的fuel屬性,WithFuel裝飾器將會覆蓋該值:JkP28資訊網——每日最新資訊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:方法裝飾器

方法裝飾器可以用于裝飾類方法。在這種情況下,裝飾器函數的類型如下:JkP28資訊網——每日最新資訊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

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

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

最后,可以使用方法裝飾器將一個方法標記為已廢棄,并記錄一條消息來警告用戶,并告知他們應該使用哪個方法代替:JkP28資訊網——每日最新資訊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函數的第一個參數是要裝飾的方法。確認它確實是一個方法后(context.kind === "method"),返回一個新的函數,該函數在調用實際方法之前包裝被裝飾的方法并記錄一條警告消息。JkP28資訊網——每日最新資訊28at.com

接下來,可以按照以下方式使用裝飾器:JkP28資訊網——每日最新資訊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方法。注意,必須將其轉換為any類型的實例,與之前一樣。當調用isReadyForLaunch()方法時,會看到以下輸出,顯示警告消息被正確地打印出來:JkP28資訊網——每日最新資訊28at.com

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

Summer:屬性裝飾器

屬性裝飾器與方法裝飾器的類型非常相似:JkP28資訊網——每日最新資訊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

屬性裝飾器的用例與方法裝飾器的用法也非常相似。例如,可以跟蹤對屬性的訪問或將其標記為已棄用:JkP28資訊網——每日最新資訊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 裝飾器非常相似,它的用法也是如此。JkP28資訊網——每日最新資訊28at.com

Summer:訪問器裝飾器

與方法裝飾器非常相似的是訪問器裝飾器,它是針對 getter 和 setter 的裝飾器:JkP28資訊網——每日最新資訊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 修飾合并到一個已棄用的函數中,該函數也支持 getter 和 setter:JkP28資訊網——每日最新資訊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

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

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

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

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

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 六款開源、免費的簡歷制作神器,程序員必備!

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

標簽:
  • 熱門焦點
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
色偷偷88欧美精品久久久| 久久人人97超碰国产公开结果| 精品一区二区在线看| 亚洲成人激情社区| 亚洲一区在线观看网站| 伊人婷婷欧美激情| 亚洲综合色网站| 亚洲国产日日夜夜| 亚洲va欧美va天堂v国产综合| 亚洲成人免费在线观看| 丝袜美腿高跟呻吟高潮一区| 五月开心婷婷久久| 免费成人在线观看| 国产一区二区三区在线观看免费| 国内精品免费**视频| 国产a区久久久| 9i在线看片成人免费| 欧美视频福利| 中文日韩欧美| 色偷偷久久一区二区三区| 欧美日韩精品专区| 精品av综合导航| 中文字幕一区二区三区乱码在线 | 在线观看亚洲一区| 欧美日韩国产精品自在自线| 日韩欧美一区二区久久婷婷| 欧美国产激情一区二区三区蜜月| 亚洲视频图片小说| 日韩1区2区3区| 国产成人一区二区精品非洲| 91一区一区三区| 国产伦精品一区二区| 欧美日韩一区成人| 国产嫩草影院久久久久| 亚洲一二三四在线观看| 韩国精品久久久| 欧美精品日韩| 久久精品毛片| 精品国产免费久久| 亚洲一区二区三区激情| 久久www免费人成看片高清| www..com久久爱| 亚洲一区网站| 精品国产青草久久久久福利| 亚洲欧美日韩国产一区二区三区 | 欧美日韩国语| 日本道色综合久久| 久久综合视频网| 亚瑟在线精品视频| 成人免费毛片高清视频| 午夜在线一区二区| 精品精品国产高清一毛片一天堂| 亚洲精品久久嫩草网站秘色| 国产精品亚洲第一区在线暖暖韩国 | 国产成人无遮挡在线视频| 伊人久久大香线蕉av超碰演员| 欧美性大战久久久| 国产精品久久久久久久久免费丝袜| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美精品一区二区三区在线看午夜 | 26uuu亚洲| 免费高清在线一区| 亚洲国产1区| 日韩精品一区二区三区中文不卡 | 国产亚洲欧美日韩日本| 免费在线欧美视频| 亚洲美女一区| 久久久亚洲精品石原莉奈| 久久69国产一区二区蜜臀| 亚洲日韩成人| 久久久久国产一区二区三区四区| 美洲天堂一区二卡三卡四卡视频 | 国产精品久久久久影院色老大 | 欧美日韩一区高清| 亚洲一区影音先锋| 国产精品地址| 久久综合五月天婷婷伊人| 麻豆精品一区二区三区| 99精品国产福利在线观看免费| 2021久久国产精品不只是精品| 免费观看日韩av| 亚洲欧美日韩精品一区二区| 一区精品在线播放| 91视频在线看| 久久综合九色综合97_久久久| 国产综合久久久久久鬼色| 久久国产一区| 夜色激情一区二区| 欧美美女直播网站| 精品国产免费一区二区三区香蕉| 视频一区中文字幕国产| 国产在线视频欧美一区二区三区| 日韩精品一区二区三区中文精品| 国产麻豆精品theporn| 91国内精品野花午夜精品 | 成人三级在线视频| 欧美一区二区三区影视| 久久精品国产久精国产| 在线精品视频小说1| 欧美96一区二区免费视频| 久久本道综合色狠狠五月| 亚洲一区二区3| 亚洲在线视频| 午夜精品影院在线观看| 亚欧成人精品| 日韩av一区二区三区| 日韩亚洲欧美在线| 亚洲成人免费电影| 亚洲专区一区二区三区| 亚洲一区在线电影| 久久久久欧美精品| 美美哒免费高清在线观看视频一区二区| 久久婷婷av| 韩国中文字幕2020精品| 91精品国产综合久久福利| 国产精品资源在线| 欧美精品一区二区三区很污很色的| 91农村精品一区二区在线| 国产精品剧情在线亚洲| 亚洲成人直播| 午夜精品一区二区三区免费视频 | 国产精品丝袜久久久久久app| 国产主播精品| 亚洲韩国一区二区三区| 欧美在线视频不卡| 不卡免费追剧大全电视剧网站| 欧美成人一级视频| 激情视频一区二区| 亚洲mv大片欧洲mv大片精品| 欧美日韩精品电影| 91农村精品一区二区在线| 日韩理论片网站| 玖玖国产精品视频| 国产成人日日夜夜| 中文字幕中文字幕在线一区 | 国产精品丝袜在线| 久久综合久久久| 成人激情黄色小说| 综合中文字幕亚洲| 欧美日韩精品综合在线| 欧美精品亚洲| 久久电影网站中文字幕| 久久精品一区二区| 亚洲女优在线| 成人av在线一区二区三区| 亚洲综合另类小说| 日韩欧美国产三级| 国产亚洲亚洲| 99久久综合精品| 亚洲第四色夜色| 久久亚洲私人国产精品va媚药| 国产一区二区三区黄| 国产69精品久久777的优势| 亚洲精品水蜜桃| 欧美xingq一区二区| 亚洲影视综合| 99re视频这里只有精品| 日av在线不卡| 亚洲天堂成人网| 欧美v日韩v国产v| 色噜噜狠狠成人网p站| 欧美黄色免费| 国产精品69久久久久水密桃| 亚洲精品国产无套在线观| 日韩一级完整毛片| 久久综合福利| 一区在线电影| hitomi一区二区三区精品| 三级欧美在线一区| 日韩一区欧美小说| 久久影院视频免费| 欧美日韩视频在线第一区| 99re66热这里只有精品4| 成人av网站在线观看免费| 日本特黄久久久高潮| 亚洲精品大片www| 国产日产欧美一区二区三区| 91精品国产高清一区二区三区蜜臀| 老司机一区二区三区| 亚洲福利av| 欧美 日韩 国产在线| 国产成人av电影免费在线观看| 日韩成人精品视频| 亚洲成av人片| 综合中文字幕亚洲| 国产欧美精品一区二区色综合 | 国产精品素人视频| 精品盗摄一区二区三区| 欧美一区二区三区四区在线观看 | 在线不卡的av| 欧美性猛交xxxxxx富婆| 久久精品一区二区国产| 国产一区二区三区免费不卡| 日韩一级免费| 一区二区av| 一区二区三区高清视频在线观看| 国产精品地址| 亚洲国产精品第一区二区| 欧美网站在线| 很黄很黄激情成人|