《TypeScript 7天速成系列》第6天:TypeScript裝飾器+混入:高級編程模式揭秘

裝飾器是TypeScript中一項強大的元編程特性,被Angular和Vue3等主流框架廣泛使用。今天我們將深入探討這一高級特性。

裝飾器基礎

裝飾器是一種特殊類型的聲明,可以附加到類聲明、方法、訪問器、屬性或參數上。裝飾器使用@expression形式,其中expression必須是一個函數。

類裝飾器

類裝飾器在類聲明之前聲明,應用于類構造函數,可以觀察、修改或替換類定義。

function sealed(constructor: Function) {Object.seal(constructor);Object.seal(constructor.prototype);
}@sealed
class Greeter {greeting: string;constructor(message: string) {this.greeting = message;}greet() {return "Hello, " + this.greeting;}
}

上面的@sealed裝飾器會阻止在類或其原型上添加或刪除屬性。

裝飾器工廠

如果需要自定義裝飾器行為,可以使用裝飾器工廠:

function color(value: string) {return function (target: any) {// 用某種方式存儲元數據target.prototype.color = value;}
}@color("red")
class Car {// ...
}const myCar = new Car();
console.log((myCar as any).color); // 輸出: red

方法裝飾器

方法裝飾器聲明在一個方法的聲明之前,可以用于觀察、修改或替換方法定義。

function log(target: any, key: string, descriptor: PropertyDescriptor) {const original = descriptor.value;descriptor.value = function(...args: any[]) {console.log(`Calling ${key} with`, args);const result = original.apply(this, args);console.log(`Called ${key}, returned`, result);return result;};return descriptor;
}class Calculator {@logadd(a: number, b: number): number {return a + b;}
}const calc = new Calculator();
calc.add(2, 3); // 日志會記錄調用和返回

屬性裝飾器

function format(formatString: string) {return function (target: any, propertyKey: string): any {let value = target[propertyKey];const getter = () => {return `${formatString} ${value}`;};const setter = (newVal: string) => {value = newVal;};return {get: getter,set: setter,enumerable: true,configurable: true};}
}class Greeter {@format("Hello,")greeting: string;constructor(message: string) {this.greeting = message;}
}const greeter = new Greeter("World");
console.log(greeter.greeting); // 輸出: Hello, World

參數裝飾器

function validate(target: any, propertyKey: string, parameterIndex: number) {const validations = target.__validations__ || (target.__validations__ = {});const paramValidations = validations[propertyKey] || (validations[propertyKey] = []);paramValidations[parameterIndex] = { type: "number", min: 0, max: 100 };
}class Temperature {setValue(@validate value: number) {console.log(`Temperature set to ${value}`);}
}

混入(Mixins)

混入是一種通過組合簡單部分類來構建復雜類的模式:

// 輔助函數
type Constructor<T = {}> = new (...args: any[]) => T;function Timestamped<TBase extends Constructor>(Base: TBase) {return class extends Base {timestamp = Date.now();};
}function Activatable<TBase extends Constructor>(Base: TBase) {return class extends Base {isActivated = false;activate() {this.isActivated = true;}deactivate() {this.isActivated = false;}};
}// 使用混入
class User {name = '';
}const TimestampedActivatableUser = Timestamped(Activatable(User));const user = new TimestampedActivatableUser();
user.name = "John";
user.activate();
console.log(user.name); // John
console.log(user.timestamp); // 當前時間戳
console.log(user.isActivated); // true

實際應用場景

  1. 日志記錄:自動記錄方法調用和參數

  2. 性能監控:測量方法執行時間

  3. 驗證:自動驗證方法參數

  4. 依賴注入:如Angular中的@Injectable

  5. ORM映射:如TypeORM中的@Entity

最佳實踐

  1. 裝飾器應該保持簡單和專注

  2. 避免在裝飾器中引入副作用

  3. 考慮使用裝飾器工廠來提高靈活性

  4. 為裝飾器提供清晰的文檔說明

  5. 注意裝飾器的執行順序:

    • 參數裝飾器 → 方法/屬性裝飾器 → 類裝飾器

    • 從下到上(對于同一類型的多個裝飾器)

裝飾器和混入為TypeScript提供了強大的元編程能力,合理使用可以大幅提高代碼的可維護性和可擴展性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75927.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75927.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75927.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLO歷代發展 圖像增強方式 架構

YOLO1 YOLOV5 數據增強 mosaic 仿射變換(Affine)、透視變換(Perspective) 網絡搭建

NX二次開發刻字功能——布爾運算

刻字功能在經歷、創建文本、拉伸功能以后就剩下布爾運算了。布爾運算的目的就是實現文本時凸還是凹。這部分內容很簡單。 1、首先識別布爾運算的類型&#xff0c;我這里用到一個枚舉類型的選項&#xff0c;凸就是布爾求和&#xff0c;凹就是布爾求差。 2、其放置位置為創建拉伸…

【MySQL基礎】數據庫及表基本操作

作為運維工程師&#xff0c;掌握MySQL的基礎操作是日常工作的重要技能之一。本文將介紹MySQL中數據庫和表的基本操作&#xff0c;幫助您快速上手或復習這些核心概念。 1 數據庫基本操作 1.1 創建數據庫 create database db_name; -- 指定字符集和排序規則 create database d…

Python貝葉斯分層模型專題|對環境健康、醫學心梗患者、體育賽事數據空間異質性實證分析合集|附數據代碼

全文鏈接&#xff1a;https://tecdat.cn/?p41267 在大數據時代&#xff0c;多水平數據結構廣泛存在于環境健康、醫學研究和體育賽事等領域。本專題合集聚焦貝葉斯分層模型&#xff08;Hierarchical Bayesian Model&#xff09;的創新應用&#xff0c;通過氡氣污染數據與 季后…

基于 Qt / HTTP/JSON 的智能天氣預報系統測試報告

目錄 一、項目概述 1.1項目背景 1.2項目目標 二、功能需求 2.1 用戶界面功能 2.2 后臺功能 三、技術選擇 3.1 開發框架與工具 3.2 第三方 API 四、UI設計 4.1界面展示 4.2stylesheet樣式 五、代碼實現 1.構造函數 2.網絡請求響應處理函數 3.處理json數據 4.更新…

GitLab 中文版17.10正式發布,27項重點功能解讀【三】

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

DPO介紹+公式推理

1. 什么是DPO&#xff1f; DPO&#xff08;Direct Preference Optimization&#xff09;是一種用于對齊大語言模型&#xff08;LLMs&#xff09;的新型方法&#xff0c;旨在高效地將人類偏好融入模型訓練中。它提供了一種替代強化學習&#xff08;如 RLHF, Reinforcement Learn…

C語言基礎—構造類型

數據類型 1.基本類型/基礎類型 整型 短整型&#xff1a;short[int] --2字節 基本整型&#xff1a;int --4字節 長整型&#xff1a;long[int] --32位4字節/64位8字節 長長整型&#xff1a;long long [int] &#xff08;C99&#xff09; 注意&#xff1a;以上類型又都分為sig…

2025年高壓電工考試真題分享

以下是一些高壓電工考試題&#xff1a; 單選題 1、高壓架空線路的檔距一般為&#xff08; &#xff09;。 A. 20 - 30m B. 30 - 50m C. 50 - 80m D. 80 - 100m 答案&#xff1a;B。解析&#xff1a;高壓架空線路檔距一般在 30 - 50m&#xff0c;這樣的檔距能較好地保證線…

什么是SQL作業

SQL作業是在數據庫服務器上按特定時間或間隔自動執行的計劃任務或流程&#xff0c;這些作業由Microsoft SQL Server中的SQL Server代理管理&#xff0c;對于自動執行日常任務&#xff08;如數據庫系統中的備份、數據導入和報告生成&#xff09;以及確保及時準確地處理和更新數據…

【數據分享】基于聯合國城市化程度框架的全球城市邊界數據集(免費獲取/Shp格式)

在全球城市化進程不斷加快的今天&#xff0c;如何精準定義和測量“城市”成為關鍵問題。不同國家和機構采用不同的標準&#xff0c;導致全球城市化水平的統計結果存在較大差異。同時&#xff0c;由于數據來源分散、標準不統一&#xff0c;獲取一套完整、可比的全球城市邊界數據…

劉火良FreeRTOS內核實現與應用學習之6——多優先級

在FreeRTOS中&#xff0c;數字優先級越小&#xff0c;邏輯優先級也越小&#xff1b;在任務創建時&#xff0c;會根據任務的優先級將任務插入就緒列表不同的位置。 List_t pxReadyTasksLists[ configMAX_PRIORITIES ] 就緒列表是一個數組&#xff0c;數組中存儲的是就緒任務TCB(…

生成信息提取的大型語言模型綜述

摘要 信息提取&#xff08;IE&#xff09;旨在從簡單的自然語言文本中提取結構知識。最近&#xff0c;生成型大型語言模型&#xff08;LLMs&#xff09;在文本理解和生成方面表現出了顯著的能力。因此&#xff0c;已經提出了許多基于生成范式將LLM集成到IE任務中的工作。為了對…

簡單談談很火的MCP( Model Context Protocol,模型上下文協議)

MCP( Model Context Protocol&#xff0c;模型上下文協議)是由Anthropic推出的開放協議&#xff0c;并非獨立的大模型&#xff0c;而是連接大模型與外部工具/數據源的標準化接口?&#xff0c;旨在解決AI工具開發中接口不統一、跨模型共享困難等問題。? 一、工作原理 MCP 協…

解決linux centos ubuntu等無法啟動谷歌chrome瀏覽器問題

命令啟動chrome時候提示&#xff1a; Running as root without --no-sandbox is not supported. See https://crbug.com/638180. 解決無法啟動谷歌chrome瀏覽器&#xff1a; cd /usr/bin 發現目錄下有 google-chrome google-chrome-stable 執行&#xff1a; vim go…

深入解析緩沖區:計算機世界的“蓄水池”與“加速器”

引言 想象這樣一個場景&#xff1a; 你的手機正在播放4K視頻&#xff0c;同時下載大型文件 視頻畫面流暢無卡頓&#xff0c;下載速度穩定在滿帶寬 但手機的內存只有8GB&#xff0c;下載文件的大小卻超過20GB 這看似矛盾的現象背后&#xff0c;緩沖區&#xff08;Buffer&am…

網絡故障診斷

一 網絡故障診斷的方法 1 試錯法&#xff1a;通過推測提出解決方案&#xff0c;最后得出故障原因的方法。 2 參照法&#xff1a;是一種比較快速解決網絡故障的方法&#xff0c;只有當故障設備與正常工作設備具有相近的條件時&#xff0c;才可以使用參照法。 3 替換法&#xff1…

界面控件Telerik和Kendo UI 2025 Q1亮點——AI集成與數據可視化

Telerik DevCraft包含一個完整的產品棧來構建您下一個Web、移動和桌面應用程序。它使用HTML和每個.NET平臺的UI庫&#xff0c;加快開發速度。Telerik DevCraft提供完整的工具箱&#xff0c;用于構建現代和面向未來的業務應用程序&#xff0c;目前提供UI for ASP.NET MVC、Kendo…

ollama遷移已下載的單個模型到服務器

ollama遷移已下載的單個模型到服務器 場景 ollama是面向用戶級的&#xff0c;部署和運行都很簡單&#xff0c;是否高效就另說了。但最起碼&#xff0c;他能充分利用用戶的硬件設備&#xff0c;在GPU不足也能調用cpu和內存去加持。 ollama運行的模型基本是量化版本的&#xf…

怎么對asp.web api進行單元測試?

在 ASP.NET Web API 中進行單元測試是一種確保代碼質量和功能正確性的重要實踐。單元測試的重點是針對 API 控制器中的邏輯進行測試&#xff0c;而不依賴于外部依賴&#xff08;如數據庫、文件系統或網絡請求&#xff09;。以下是實現 ASP.NET Web API 單元測試的步驟和方法&am…