首頁 >web前端 >js教程 >快速提示:打字稿中的裝飾器

快速提示:打字稿中的裝飾器

Lisa Kudrow
Lisa Kudrow原創
2025-02-08 10:11:15405瀏覽

TypeScript 5.0 中的裝飾器:優雅地修改類和方法

Quick Tip: Decorators in TypeScript

本文節選自《釋放TypeScript的威力》,將向您展示如何在TypeScript 5.0中使用裝飾器這一新特性。

裝飾器幾乎一直是ECMAScript的一部分。這些簡潔的工具允許我們以可重用的方式修改類和成員。它們在TypeScript中已經存在一段時間了——儘管是在實驗性標誌下。雖然裝飾器的Stage 2迭代一直是實驗性的,但它們已被廣泛應用於MobX、Angular、Nest和TypeORM等庫中。 TypeScript 5.0的裝飾器與ECMAScript提案完全同步,已經非常成熟,處於Stage 3階段。

裝飾器允許我們創建一個函數,該函數可以調整類及其方法的行為。假設我們需要在方法中添加一些調試語句。在TypeScript 5.0之前,我們只能手動在每個方法中復制粘貼調試語句。使用裝飾器,我們只需操作一次,更改就會應用於裝飾器附加的每個方法。

讓我們創建一個用於記錄給定方法已棄用的裝飾器:

<code class="language-typescript">class Card {
  constructor(public suit: Suit, public rank: Rank) {
    this.suit = suit;
    this.rank = rank;
  }

  get name(): CardName {
    return `${this.rank} of ${this.suit}`;
  }

  @deprecated // ? 这是一个装饰器!
  getValue(): number {
    if (this.rank === 'Ace') return 14;
    if (this.rank === 'King') return 13;
    if (this.rank === 'Queen') return 12;
    if (this.rank === 'Jack') return 11;
    return this.rank;
  }

  // 新的实现方式!
  get value(): number {
    if (this.rank === 'Ace') return 14;
    if (this.rank === 'King') return 13;
    if (this.rank === 'Queen') return 12;
    if (this.rank === 'Jack') return 11;
    return this.rank;
  }
}

const card = new Card('Spades', 'Queen');
card.getValue();</code>

我們希望每當調用card.getValue()時,都會向控制台記錄一條警告消息。我們可以如下實現上述裝飾器:

<code class="language-typescript">const deprecated = <this arguments extends any returnvalue>(
  target: (this: This, ...args: Arguments) => ReturnValue,
  context: ClassMethodDecoratorContext<returnvalue>
) => {
  const methodName = String(context.name);

  function replacementMethod(this: This, ...args: Arguments): ReturnValue {
    console.warn(`Warning: '${methodName}' is deprecated.`);
    return target.call(this, ...args);
  }

  return replacementMethod;
};</returnvalue></this></code>

乍一看這可能有點令人困惑,但讓我們分解一下:

  • 我們的裝飾器函數接受兩個參數:target和context。
  • target是我們正在裝飾的方法本身。
  • context是關於該方法的元數據。
  • 我們返回一個具有相同簽名的函數。
  • 在這種情況下,我們調用console.warn來記錄棄用通知,然後調用該方法。

ClassMethodDecorator類型具有以下屬性:

  • kind:被裝飾屬性的類型。在上面的示例中,這將是method,因為我們正在裝飾Card實例上的方法。
  • name:屬性的名稱。在上面的示例中,這是getValue。
  • static:一個值,指示類元素是靜態(true)還是實例(false)元素。
  • private:一個值,指示類元素是否具有私有名稱。
  • access:一個對象,可以在運行時用於訪問類元素的當前值。
  • has:確定對像是否具有與被裝飾元素同名的屬性。
  • get:在提供的對像上調用setter。

您可以在此playground中測試上面的代碼示例。

裝飾器為添加日誌消息(如我們在上面的示例中所做的那樣)以及許多其他常見用例提供了方便的語法糖。例如,我們可以創建一個裝飾器,該裝飾器會自動將方法綁定到當前實例,或者修改方法或類的屬性描述符。

本文節選自《釋放TypeScript的威力》,可在SitePoint Premium和電子書零售商處購買。

以上是快速提示:打字稿中的裝飾器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn