【TS學習】(23)理解類的雙重角色

在 TypeScript 中,類(class)不僅是一個運行時的值(即可以實例化對象的構造函數),同時也是一個類型聲明。具體來說,類在 TypeScript 中既聲明了值,也聲明了類型,并且它的類型分為兩種:

  1. 實例化對象類型:描述通過 new 操作符創建的實例的結構。
  2. 類構造函數類型:描述類本身的結構(包括構造函數和靜態成員)。

1. 類聲明值

(1) 作為值
  • 在運行時,類是一個普通的 JavaScript 構造函數。
  • 它可以通過 new 關鍵字實例化對象。
示例
class User {name: string;constructor(name: string) {this.name = name;}greet(): void {console.log(`Hello, ${this.name}`);}
}// 使用類作為值
const user = new User("Alice");
user.greet(); // 輸出 "Hello, Alice"

在這里:

  • User 是一個構造函數,可以在運行時通過 new 創建實例。

2. 類聲明類型

(1) 實例化對象類型
  • 類本身也可以作為一個類型,用來描述通過 new 操作符創建的實例的結構。
  • 這種類型被稱為實例化對象類型
示例
class User {name: string;constructor(name: string) {this.name = name;}greet(): void {console.log(`Hello, ${this.name}`);}
}// 使用類作為類型
function printUser(user: User): void {console.log(user.name);
}const alice = new User("Alice");
printUser(alice); // 輸出 "Alice"

在這里:

  • User 被用作類型,表示 alice 的類型是 User 類的實例。

(2) 類構造函數類型
  • 類本身也有一個類型,稱為類構造函數類型,它描述了類的靜態成員和構造函數簽名。
  • 這種類型可以通過 typeof ClassName 獲取。
示例
class User {static defaultName: string = "Guest";name: string;constructor(name: string) {this.name = name;}greet(): void {console.log(`Hello, ${this.name}`);}
}// 使用類構造函數類型
function createUser(ctor: typeof User, name: string): User {return new ctor(name);
}const bob = createUser(User, "Bob");
bob.greet(); // 輸出 "Hello, Bob"console.log(User.defaultName); // 輸出 "Guest"

在這里:

  • typeof User 表示 User 類的構造函數類型。
  • createUser 函數接受一個類構造函數 ctor 和一個名稱 name,并通過 new ctor(name) 創建實例。

3. 實例化對象類型與類構造函數類型的區別

特性實例化對象類型類構造函數類型
定義描述通過 new 創建的實例的結構。描述類本身的結構(包括靜態成員)。
獲取方式直接使用類名(如 User)。使用 typeof ClassName
用途用于限制實例的結構。用于限制類構造函數的結構。
示例const user: User = new User();const ctor: typeof User = User;

4. 綜合示例

以下是一個綜合示例,展示了如何同時使用實例化對象類型和類構造函數類型。

示例代碼
class User {static defaultName: string = "Guest";name: string;constructor(name: string) {this.name = name || User.defaultName;}greet(): void {console.log(`Hello, ${this.name}`);}
}// 使用實例化對象類型
function printUser(user: User): void {console.log(user.name);
}// 使用類構造函數類型
function createUser(ctor: typeof User, name?: string): User {return new ctor(name);
}// 測試
const alice = new User("Alice");
printUser(alice); // 輸出 "Alice"const guest = createUser(User);
guest.greet(); // 輸出 "Hello, Guest"

在這里:

  • User 作為實例化對象類型,用于限制 printUser 函數的參數類型。
  • typeof User 作為類構造函數類型,用于限制 createUser 函數的第一個參數類型。

5. 高級用法:泛型與類類型

結合泛型和類類型,可以實現更靈活的設計。

示例:工廠函數
class Point {x: number;y: number;constructor(x: number, y: number) {this.x = x;this.y = y;}
}function createInstance<T>(ctor: new (...args: any[]) => T, ...args: any[]): T {return new ctor(...args);
}const point = createInstance(Point, 10, 20);
console.log(point.x, point.y); // 輸出 10, 20

在這里:

  • createInstance 是一個通用的工廠函數,接受一個類構造函數和構造參數,返回類的實例。
  • new (...args: any[]) => T 是類構造函數類型的泛型約束。

6. 總結

  • 類聲明值
    • 類是一個運行時的構造函數,可以通過 new 創建實例。
  • 類聲明類型
    • 實例化對象類型:描述類實例的結構。
    • 類構造函數類型:描述類本身的結構(包括靜態成員和構造函數簽名)。
  • 區別
    • 實例化對象類型關注實例的屬性和方法。
    • 類構造函數類型關注類的靜態成員和構造函數。
  • 應用場景
    • 實例化對象類型用于限制實例的類型。
    • 類構造函數類型用于限制類的類型(如工廠函數)。

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

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

相關文章

IAP Firmware Upload Tools.exe IAP 網絡固件升級教程

IAP是In Application Programming的簡寫&#xff0c;IAP升級可以被視為固件升級的一種形式,它是一種在應用程序運行過程中對固件進行更新的技術手段。允許MCU在運行過程中對MCU User Flash的部分區域進行燒寫,目的是為了代替編程器對MCU燒錄的依賴。 主程序UI 軟件按鈕說明&a…

Uniapp當中的async/await的作用

一、原始代碼的行為&#xff08;使用 async/await&#xff09; const getUserMessagePlan async () > {// 等待兩個異步操作完成const tabsList await message.getTagesList(); // 等待獲取標簽列表const tagsStateList await message.getTagsStateList(); // 等…

設計模式 Day 5:夯實觀察者模式(Boost 實戰精講)

今天我們繼續深入觀察者模式的學習&#xff0c;不再局限于手寫的抽象結構&#xff0c;而是聚焦于真實項目中如何使用成熟框架&#xff08;如 Boost.Signals2&#xff09;高效落地觀察者模式。 本篇采用**“理論解析 問答講解 實戰用例”**結構&#xff0c;幫助你從設計思想到…

設計模式 Day 3:抽象工廠模式(Abstract Factory Pattern)詳解

經過前兩天的學習&#xff0c;我們已經掌握了單例模式與工廠方法模式&#xff0c;理解了如何控制實例個數與如何通過子類封裝對象的創建邏輯。 今天&#xff0c;我們將進一步深入“工廠”體系&#xff0c;學習抽象工廠模式&#xff08;Abstract Factory Pattern&#xff09;&a…

MySQL:事務的理解

一、CURD不加控制&#xff0c;會有什么問題 &#xff08;1&#xff09;因為&#xff0c;MySQL里面存的是數據&#xff0c;所以很有可能會被多個客戶訪問&#xff0c;所以mysqld可能一次會接受到多個關于CURD的請求。&#xff08;2&#xff09;且mysql內部是采用多線程來完成數…

藍橋杯刷題--寶石組合

在一個神秘的森林里&#xff0c;住著一個小精靈名叫小藍。有一天&#xff0c;他偶然發現了一個隱藏在樹洞里的寶藏&#xff0c;里面裝滿了閃爍著美麗光芒的寶石。這些寶石都有著不同的顏色和形狀&#xff0c;但最引人注目的是它們各自獨特的 “閃亮度” 屬性。每顆寶石都有一個…

DAY06:【pytorch】圖像增強

1、基本概念 數據增強&#xff0c;又稱數據增廣、數據擴增&#xff0c;是對訓練集進行變換&#xff0c;使訓練集更豐富&#xff0c;從而讓模型更具泛化能力 2、裁剪 — — Crop 2.1 transforms.CenterCrop 功能&#xff1a;從圖像中心裁剪圖片 size&#xff1a;所需裁剪圖…

mysql 禁止 讀 某個 表

mysql 禁止 讀 某個 表 mysql禁用某張表,禁用MySQL表的操作 https://shuyeidc.com/wp/89479.html MySQL嚴格禁止讀取表如何避免數據泄露 https://www.kdun.cn/ask/394700.html select host,user from mysql.user; FLUSH PRIVILEGES; 1. MySQL嚴格禁止讀取表如何避免數據泄露…

機器學習 從入門到精通 day_03

1. KNN算法-分類 1.1 樣本距離判斷 明可夫斯基距離&#xff1a;歐式距離&#xff0c;明可夫斯基距離的特殊情況&#xff1b;曼哈頓距離&#xff0c;明可夫斯基距離的特殊情況。 兩個樣本的距離公式可以通過如下公式進行計算&#xff0c;又稱為歐式距離。 &#xff08;…

LeetCode 熱題 100_零錢兌換(85_322_中等_C++)(動態規劃)

LeetCode 熱題 100_零錢兌換&#xff08;85_322&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;動態規劃&#xff09;&#xff1a; 代碼實現代碼實現&#xff08;思路一&#xff08;動態規劃&#xff09;&a…

游戲盾IP可以被破解嗎

游戲盾IP&#xff08;如上海云盾SDK、騰訊云游戲盾&#xff09;是專為游戲行業設計的高防服務&#xff0c;旨在抵御DDoS攻擊、CC攻擊等威脅。其安全性取決于??技術架構、防護能力??以及??運維策略??。雖然理論上沒有絕對“無法破解”的系統&#xff0c;但游戲盾IP在合理…

SpringBoot實戰1

SpringBoot實戰1 一、開發環境&#xff0c;環境搭建-----創建項目 通過傳統的Maven工程進行創建SpringBoot項目 &#xff08;1&#xff09;導入SpringBoot項目開發所需要的依賴 一個父依賴&#xff1a;&#xff08;工件ID為&#xff1a;spring-boot-starter-parent&#xf…

【軟考-高級】【信息系統項目管理師】【論文基礎】進度管理過程輸入輸出及工具技術的使用方法

定義 項目進度管理是為了保證項目按時完成&#xff0c;對項目中所需的各個過程進行管理的過程&#xff0c;包括規劃進度、定義活動、活動優先級排序、活動持續時間、制定進度計劃和控制進度。 管理基礎 制定進度計劃的一般步驟 選擇進度計劃方法&#xff08;如關鍵路徑法&a…

【Linux】之【Get】 chroot 環境下安裝deb包時 .postinst:行 9: 201 段錯誤 (核心已轉儲)ldconfig

背景 如題&#xff0c;在postinst文件中直接執行了ldconfig命令&#xff0c; chroot 環境下出錯&#xff0c;安裝失敗 分析 chroot 環境下不能用 ldconfig 和 systemctl 但是&#xff1a;如果環境是 chroot&#xff0c;系統有可能沒完整掛載 /proc、/dev、系統路徑&#xff…

【論文精讀與實現】EDC2-RAG:基于動態聚類的文檔壓縮方法提升檢索增強生成RAG性能

?? 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net ?? 歡迎點擊加入AI人工智能社區! ?? 讓我們一起努力,共創AI未來! ?? 1. 論文核心思想 這篇由清華大學團隊提出的EDC-RAG框架,針對當前…

OSPF接口的網絡類型和不規則區域

網絡類型(數據鏈路層所使用的協議所構建的二層網絡類型) 1、MA --- 多點接入網絡 BMA --- 支持廣播的多點接入網絡 NBMA --- 不支持廣播的多點接入網絡 2、P2P --- 點到點網絡 以太網 --- 以太網最主要的特點是需要基于MAC地址進行物理尋址&#xff0c;主要是因為以太網接口所連…

HTTP代理:內容分發戰場上的「隱形指揮官」

目錄 一、技術本質&#xff1a;流量博弈中的「規則改寫者」 二、戰略價值&#xff1a;內容分發的「四維升級」 三、實戰案例&#xff1a;代理技術的「降維打擊」 四、未來進化&#xff1a;代理技術的「認知升級」 五、結語&#xff1a;代理技術的「戰略覺醒」 在數字內容爆…

(2)網絡學習之堡壘機

堡壘機和防火墻的區別&#xff1a; 1.功能定位 防火墻主要負責抵御外部攻擊&#xff0c;就像一道堅固的城墻&#xff0c;防止黑客進入內部網絡。堡壘機則專注于內部管理&#xff0c;監控和記錄運維人員的操作行為&#xff0c;確保內部網絡的安全。 2.部署位置與作用范圍 防…

minio命令行客戶端mc常見用法

安裝minio命令行客戶端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安裝minio命令行客戶端 choco install minio-client -y# Linux安裝mc客戶端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 賦予可…

idea調整控制臺日志顯示長度

概述 在調試時&#xff0c;idea控制臺顯示的日志有長度顯示&#xff0c;當顯示的日志太長時&#xff0c;后生成的日志會覆蓋掉之前生成的日志內容。想要調整長度就可以按以下方式進行設置。 設置方法 Settings -> Editor -> General -> Console -> Override con…