TypeScript 中 keyof、typeof 和 instanceof

????????在 TypeScript 開發中,keyoftypeof instanceof 是核心的類型操作符和操作符,專門用于提升類型安全、代碼可讀性和維護性。

1.?keyof?操作符

  • 定義和用途keyof 是一個類型操作符,用于獲取對象類型的所有鍵(屬性名)的聯合類型。它在編譯時工作,主要用于靜態類型檢查,避免硬編碼屬性名錯誤。

  • API 語法type Keys = keyof T;,其中 T 是對象類型。

  • 使用場景

    • 動態訪問對象屬性時,確保屬性名存在。

    • 結合泛型或映射類型創建靈活的類型約束。

  • 示例代碼

interface User {id: number;name: string;age: number;
}// 獲取 User 接口所有鍵的聯合類型: "id" | "name" | "age"
type UserKeys = keyof User;// 應用:安全訪問屬性函數
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {return obj[key]; // 編譯時確保 key 是有效屬性
}const user: User = { id: 1, name: "Alice", age: 30 };
const userName = getProperty(user, "name"); // 正確,類型為 string
// const error = getProperty(user, "email"); // 編譯錯誤:"email" 不是 User 的鍵

2.?typeof?操作符

  • 定義和用途:在 TypeScript 中,typeof 是一個類型操作符,用于獲取變量或表達式的靜態類型(編譯時)。它不同于 JavaScript 的運行時 typeof,專注于類型系統,幫助推導復雜類型。

  • API 語法type VarType = typeof variable;

  • 使用場景

    • 快速基于現有變量定義新類型。

    • 避免重復聲明類型,提高代碼復用性。

示例代碼

const userObj = { id: 1, name: "Bob", isAdmin: true };// 獲取 userObj 的類型: { id: number; name: string; isAdmin: boolean; }
type UserType = typeof userObj;// 應用:函數參數類型推導
function printUser(user: typeof userObj) {console.log(user.name); // 安全訪問
}printUser({ id: 2, name: "Charlie", isAdmin: false }); // 正確
// printUser({ id: 3, name: "Dave" }); // 編譯錯誤:缺少 isAdmin 屬性

3.?instanceof?操作符

  • 定義和用途instanceof 是一個運行時操作符,用于檢查對象是否為某個類或構造函數的實例。在 TypeScript 中,它常用作類型守衛,縮小變量類型范圍。

  • API 語法if (obj instanceof Class) { ... }

  • 使用場景

    • 類型守衛:在條件塊中優化類型推斷。

    • 面向對象編程中,確保對象屬于特定類。

  • 示例代碼

class Animal {name: string;constructor(name: string) {this.name = name;}
}class Dog extends Animal {bark() {console.log("Woof!");}
}function handleAnimal(animal: Animal) {if (animal instanceof Dog) {// 類型守衛:animal 被縮小為 Dog 類型animal.bark(); // 安全調用 Dog 特有方法} else {console.log(animal.name); // animal 類型為 Animal}
}const myDog = new Dog("Buddy");
handleAnimal(myDog); // 輸出 "Woof!"

總結

操作符執行階段輸入輸出典型場景
keyof編譯時對象類型(type/interface鍵名字面量聯合類型("key1" | "key2"動態屬性訪問、映射類型
typeof編譯時/運行時變量/值類型上下文:詳細類型結構
表達式:基本類型字符串
類型捕獲、類型守衛
instanceof運行時對象實例boolean運行時類型檢查、原型鏈驗證
  • 核心區別

    • keyof 是編譯時類型操作符,用于提取鍵的聯合類型,增強對象屬性安全性。

    • typeof 是編譯時類型操作符,用于推導變量類型,提升代碼復用。

    • instanceof 是運行時操作符,用于類型檢查和守衛,處理繼承和多態。

  • 適用場景

    • 使用 keyoftypeof 組合(如 keyof typeof obj)能靜態定義動態屬性訪問。

    • instanceof 在面向對象設計中不可或缺,確保類型安全運行時。

  • 最佳實踐:在前端開發中,結合這些操作符能減少 bug(如非法屬性訪問),提升代碼可維護性。TypeScript 的類型系統通過這些工具,實現了強類型優勢。

?? 重要區別

  • keyof 和類型上下文的 typeof純類型操作(編譯后消失)

  • instanceof 和表達式的 typeof運行時操作(會生成JS代碼)

以上講解基于 TypeScript 5.x 版本,確保邏輯清晰和實用性。

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

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

相關文章

分布式專題——1.1 Redis單機、主從、哨兵、集群部署

1 Redis 部署 下面演示在 Linux 環境下部署 Redis7。 1.1 單機部署 1.1.1 檢查安裝 gcc 環境Redis 是由 C 語言編寫的&#xff0c;它的運行需要 C 環境&#xff0c;因此我們需要先安裝 gcc&#xff1b; # 關閉防?墻 systemctl stop firewalld.service # 查看防火墻狀態 firewa…

2025年滲透測試面試題總結-54(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。1、SQL注入的防護方法有哪些&#xff1f; 2、永恒之藍的漏洞原理是什么&#xff1f;怎么做到的&#xff1f; 3、命令…

安卓學習 之 按鈕點擊事件

今天學習安卓應用中的按鈕點擊事件&#xff1a;總結下來在安卓應用中的Button注冊點擊事件的方法主要是以下4種方法&#xff0c;稍后會逐個介紹&#xff1a; 第一種方法&#xff1a;自定義內部類的方法 第二種方法&#xff1a;匿名內部類的方法 第三種方法&#xff1a;當前Acti…

鴻蒙NEXT主題設置指南:應用級與頁面級主題定制詳解

在鴻蒙應用開發中&#xff0c;靈活的主題設置能力是實現個性化用戶體驗的關鍵技術&#xff0c;HarmonyOS NEXT提供了強大而靈活的主題設置功能&#xff0c;讓開發者能夠輕松實現應用級和頁面級的主題定制。在當今追求個性化的時代&#xff0c;用戶希望應用能夠根據自己的喜好呈…

全球汽車氮化鎵技術市場規模將于2031年增長至180.5億美元,2025-2031年復合增長率達94.3%,由Infineon和Navitas驅動

全球汽車氮化鎵技術市場規模將于2031年增長至180.5億美元&#xff0c;2025-2031年復合增長率達94.3%&#xff0c;由Infineon和Navitas驅動汽車氮化鎵技術正從一個有前景的細分市場加速進入主流電力電子領域。根據QYResearch&#xff08;恒州博智&#xff09;的《全球汽車GaN技術…

xftp斷網后提示錯誤如何繼續下載?

問題&#xff1a;xftp斷網后提示錯誤如何繼續下載&#xff1f;解決方法&#xff1a;斷網后&#xff0c;先連接上網&#xff0c;然后繼續雙擊右側的那兩個要傳輸的文件&#xff0c;然后會彈出一個覆蓋還是繼續下載&#xff08;如下圖&#xff09;的選擇框&#xff0c;選擇繼續下…

Day22_【機器學習—集成學習(4)—Boosting—GBDT算法】

提升樹 &#xff08;Boosting Decision Tree &#xff09;每一個弱學習器通過擬合殘差來構建強學習器梯度提升樹 &#xff08;Gradient Boosting Decision Tree&#xff09;每一個弱學習器通過擬合負梯度來構建強學習器一、提升樹殘差數學公式為&#xff1a;殘差真實值?預測值…

前綴和、子矩陣的和;差分、差分矩陣

一、前綴和數組要稍微注意前綴和數組從1開始#include <iostream>using namespace std;const int N 100010;int n, m; int a[N], s[N];int main() {scanf("%d%d", &n, &m);for (int i 1; i < n; i ) scanf("%d", &a[i]);for (int i…

啟用BBR擁塞控制算法

目錄 &#x1f4cb; 先決條件 &#x1f527; 啟用步驟 &#x1f4dd; 額外檢查與說明 ?? 注意事項 BBR&#xff08;Bottleneck Bandwidth and Round-trip time&#xff09;是谷歌開發的一種TCP擁塞控制算法&#xff0c;它能有效提升網絡傳輸速度和性能&#xff0c;尤其在…

Python:AI開發第一語言的全面剖析

文章目錄引言1. Python的歷史與AI開發的契合1.1 Python的誕生與設計哲學1.2 Python與AI發展的歷史交匯2. 語言特性如何支持AI開發2.1 動態類型與交互式編程2.2 簡潔優雅的語法2.3 高級數據結構的原生支持2.4 函數式編程特性2.5 強大的元編程能力3. 豐富的AI生態系統和庫支持3.1…

Nikto 漏洞掃描工具使用指南

目錄 ? 核心功能一覽 &#x1f680; 基本使用方法 1. 掃描單個目標 2. 指定端口掃描 3. 掃描 HTTPS 目標 使用 -ssl 參數主要有兩個核心原因 ?? 高級使用技巧 1. 使用代理掃描 2. 保存掃描結果 3. 使用特定插件 4.交互命令 ? 核心功能一覽 Nikto 是一款開源的 W…

FunASR的Java實現Paraformer實時語音識別 | 一款無需聯網的本地實時字幕軟件

0. 開發背景 我們在看直播時&#xff0c;沒有視頻字幕&#xff0c;可能看慣了視頻字幕&#xff0c;來到直播中缺少字幕會感覺不習慣&#xff0c;特別是對于聽力障礙的人群&#xff0c;只能依賴于字幕&#xff0c;那么這個軟件可以解決直播&#xff0c;在線會議等場景中無字幕的…

從機器學習的角度實現 excel 中趨勢線:揭秘梯度下降過程

1. 引言&#xff1a;Excel 的“一鍵魔法”背后藏著什么智慧&#xff1f;在 Excel 中&#xff0c;我們只需右鍵 → 添加趨勢線&#xff0c;一條完美的直線就出現了。它快得像魔法&#xff0c;但魔法背后&#xff0c;是數學的嚴謹。今天&#xff0c;我們不關心 Excel 內部用了什么…

關于上拉電阻

上拉電阻的作用&#xff1a;輔助浮空狀態輸出高電平 其實就是確定這根線的電平&#xff0c;不能讓他處于一種未知的狀態。 其次也可以起到限制電流的作用&#xff0c;防止損壞原件 那么上拉電阻如何取值&#xff1f; 首先來看一下驅動能力。 因為線上是一定有寄生電容的&am…

PiscCode構建Mediapipe 手勢識別“剪刀石頭布”小游戲

在計算機視覺與人機交互領域&#xff0c;手勢識別是一個非常有趣的應用場景。本文將帶你用 Mediapipe 和 Python 實現一個基于攝像頭的手勢識別“剪刀石頭布”小游戲&#xff0c;并展示實時手勢與游戲結果。 1. 項目概述 該小游戲能夠實現&#xff1a; 實時檢測手勢&#xff0…

【VoNR】VoNR 不等于 VoLTE on 5G

博主未授權任何人或組織機構轉載博主任何原創文章&#xff0c;感謝各位對原創的支持&#xff01; 博主鏈接 本人就職于國際知名終端廠商&#xff0c;負責modem芯片研發。 在5G早期負責終端數據業務層、核心網相關的開發工作&#xff0c;目前牽頭6G技術研究。 博客內容主要圍繞…

計算機網絡:網絡設備在OSI七層模型中的工作層次和傳輸協議

OSI七層模型&#xff08;物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層&#xff09;中&#xff0c;不同網絡設備因功能不同&#xff0c;工作在不同層次。以下是典型網絡設備的工作層次及核心功能&#xff1a;1. 物理層&#xff08;第1層&#xff09; 核心功能&a…

RSA-e和phi不互素

1.題目import gmpy2 import libnum p 1656713884642828937525841253265560295123546793973683682208576533764344166170780019002774068042673556637515136828403375582169041170690082676778939857272304925933251736030429644277439899845034340194709105071151095131704526…

基于單片機蒸汽壓力檢測/蒸汽余熱回收

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;單片機作品題目速選一覽表&#x1f680; &#x1f449;&#x1f449;&#x1f449;&#x1f449;單片機作品題目功能速覽&#x1f680; &#x1f525;更多文章戳&#x1f449;小新單片機-CSDN博客&#x1f68…

https 協議與 wss 協議有什么不同

HTTPS 是用于網頁數據傳輸的安全協議&#xff0c;而 WSS 是用于實時雙向通信&#xff08;如聊天、直播&#xff09;的安全協議&#xff0c;二者的設計目標、應用場景、底層邏輯均存在本質區別。以下從 7 個核心維度展開對比&#xff0c;并補充關鍵關聯知識&#xff0c;幫助徹底…