TypeScript 5.0 中的裝飾器:優雅地修改類和方法
本文節選自《釋放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>
乍一看這可能有點令人困惑,但讓我們分解一下:
ClassMethodDecorator類型具有以下屬性:
您可以在此playground中測試上面的代碼示例。
裝飾器為添加日誌消息(如我們在上面的示例中所做的那樣)以及許多其他常見用例提供了方便的語法糖。例如,我們可以創建一個裝飾器,該裝飾器會自動將方法綁定到當前實例,或者修改方法或類的屬性描述符。
本文節選自《釋放TypeScript的威力》,可在SitePoint Premium和電子書零售商處購買。
以上是快速提示:打字稿中的裝飾器的詳細內容。更多資訊請關注PHP中文網其他相關文章!