TypeScript中的類型斷言(type assertion),如何使用類型斷言進行類型轉換?

一、什么是類型斷言?

類型斷言(Type Assertion)是 TypeScript 中一種顯式指定變量類型的方式,它告訴編譯器:“我比編譯器更清楚這個值的類型”。?這不是運行時類型轉換,而是編譯階段的類型聲明輔助機制。類型斷言不會改變變量的實際內存結構,僅影響編譯階段的類型檢查。

// 假設從第三方庫獲取的數據被識別為 any 類型
const rawData: any = '2023-10-01';// 開發者明確知道這是日期字符串,使用類型斷言
const dateString = rawData as string;
console.log(dateString.slice(0,4)); // 輸出 "2023"
二、類型斷言的兩套語法
  1. ?尖括號語法?(不適用于 JSX)
const value: any = "hello";
const strLength: number = (<string>value).length;
  1. ?as 語法?(推薦通用寫法)
const value: any = "hello";
const strLength: number = (value as string).length;
三、典型應用場景(附代碼示例)
1. 處理聯合類型收窄
interface Cat { meow(): void }
interface Dog { bark(): void }function handleAnimal(pet: Cat | Dog) {// 明確知道當前是 Cat 類型時if ('meow' in pet) {(pet as Cat).meow(); // 斷言輔助調用特定方法}
}
2. DOM 元素類型斷言
// 獲取元素時編譯器無法推斷具體類型
const inputElement = document.getElementById('username') as HTMLInputElement;
inputElement.value = 'admin'; // 斷言后可直接訪問 value 屬性const canvas = document.querySelector('#gameCanvas') as HTMLCanvasElement;
const ctx = canvas.getContext('2d'); // 正確識別 canvas 上下文類型
3. 處理 any 類型轉換
// 從 localStorage 獲取的序列化數據
const userData: any = JSON.parse(localStorage.getItem('user'));// 開發者明確數據結構時進行斷言
interface UserProfile {id: number;name: string;
}
const profile = userData as UserProfile;
console.log(profile.name.toUpperCase()); // 編譯通過
4. 非空斷言(慎用!)
type Person = {name?: string;age?: number;
}function printName(person: Person) {// 明確知道 name 屬性必然存在console.log(person.name!.toUpperCase()); // ! 表示非空斷言
}printName({ name: 'Alice' }); // 正確輸出 "ALICE"
四、使用建議與最佳實踐
  1. ?優先使用類型守衛
// 比類型斷言更安全的做法
function isCat(pet: Cat | Dog): pet is Cat {return 'meow' in pet;
}if (isCat(pet)) {pet.meow(); // 自動類型收窄
}
  1. ?外部數據必須驗證
interface APIResponse {code: number;data: { items: string[] };
}// 從網絡請求獲取的數據
fetch('/api/data').then(res => res.json()).then((raw: unknown) => {// 先進行類型斷言再進行校驗const response = raw as APIResponse;if (response.code === 200 && Array.isArray(response.data?.items)) {// 安全使用數據}});
  1. ?避免多層嵌套斷言
// 錯誤示例:雙重斷言繞過類型檢查
const value = 123 as any as string; // 正確做法:重新設計類型結構
interface StringOrNumber {value: string | number;
}
  1. ?為復雜對象提供類型聲明文件
// 第三方庫類型增強示例
declare module 'legacy-library' {interface WidgetConfig {id: string;dimensions: [number, number];}export function createWidget(config: WidgetConfig): HTMLElement;
}// 使用時有完整類型提示
import { createWidget } from 'legacy-library';
createWidget({ id: 'w1', dimensions: [100, 200] });
五、需要警惕的陷阱
  1. ?斷言與運行時類型不符
const num: any = 123;
const str = num as string;console.log(str.toUpperCase()); // 編譯通過,運行時報錯!
  1. ?過度使用 any 類型
// 錯誤示范:濫用 any 導致類型系統失效
const dangerous: any = fetchExternalData();
const processed = dangerous as UserData;// 正確做法:定義精確類型并驗證
interface ValidatedData { /* ... */ }
function validate(data: unknown): data is ValidatedData { /* ... */ }
  1. ?忽略可選屬性風險
interface Config {timeout?: number;
}function init(config: Config) {// 危險的非空斷言!const safeTimeout = config.timeout! * 1000; 
}init({}); // 運行時得到 NaN
六、性能與工程化考量
  1. ?在構建流程中加入類型檢查
# 開啟嚴格模式編譯
tsc --strict --noImplicitAny
  1. ?使用 ESLint 規則約束
{"@typescript-eslint/consistent-type-assertions": ["error",{ "assertionStyle": "as","objectLiteralTypeAssertions": "never"}]
}
總結

類型斷言是 TypeScript 開發中的瑞士軍刀,但要謹慎使用。建議遵循以下原則:

  1. 優先使用類型推斷和類型守衛
  2. 對外部數據堅持運行時校驗
  3. 斷言范圍盡量縮小到變量級別
  4. 在團隊中制定統一的斷言使用規范

通過合理運用類型斷言,可以在保持類型安全的前提下,靈活處理邊界場景,提升代碼可維護性。

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

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

相關文章

分區表和分表

分區表&#xff08;Partitioning&#xff09; 定義 分區表是將單個表的數據按照某種規則&#xff08;如范圍、列表、哈希等&#xff09;劃分為多個邏輯部分&#xff0c;每個部分稱為一個分區。數據仍然存儲在一個物理表中&#xff0c;但邏輯上被分割為多個分區。 特點 邏輯…

C++從入門到入土(八)——多態的原理

目錄 前言 多態的原理 動態綁定與靜態綁定 虛函數表 小結 前言 在前面的文章中&#xff0c;我們介紹了C三大特性之一的多態&#xff0c;我們主要介紹了多態的構成條件&#xff0c;但是對于多態的原理我們探討的是不夠深入的&#xff0c;下面這這一篇文章&#xff0c;我們將…

用Maven創建只有POM文件的項目

使用 mvn 創建一個僅包含 pom.xml 文件的父項目&#xff0c;可以借助 maven-archetype-quickstart 原型&#xff0c;然后移除不必要的文件&#xff0c;或者直接通過命令生成最簡的 pom.xml 文件。以下是具體操作步驟&#xff1a; 一、方法一&#xff1a;使用原型創建后清理 1…

Linux目錄理解

前言 最近在復習linux&#xff0c;發現有些目錄總是忘記內容&#xff0c;發現有些還是得從原義和實際例子去理解會記憶深刻些。以下是個人的一些理解 Linux目錄 常見的Linux下的目錄如下&#xff1a; 1. 根目錄 / (Root Directory) 英文含義&#xff1a;/ 是文件系統的根…

gitee AI使用

gitee AI使用 gitee AI使用 gitee AI使用簡介正文開始1. 安裝openai2. 測試2.1 不使用流2.2 使用流 2.3 使用curl工具 簡介 發現gitee 推出了個ai幫助多數人使用ai&#xff0c;突破算力和模型的壁壘&#xff0c;我就遵從開源精神&#xff0c;測試了下&#xff0c;希望可以幫助…

c++領域展開第十七幕——STL(vector容器的模擬實現以及迭代器失效問題)超詳細!!!!

文章目錄 前言vector——基本模型vector——迭代器模擬實現vector——容量函數以及push_back、pop_backvector——默認成員函數vector——運算符重載vector——插入和刪除函數vector——實現過程的問題迭代器失效memcpy的淺拷貝問題 總結 前言 上篇博客我們已經詳細介紹了vecto…

WPF 開發從入門到進階(五)

一、WPF 簡介與開發環境搭建 1.1 WPF 概述 Windows Presentation Foundation&#xff08;WPF&#xff09;是微軟推出的用于構建 Windows 桌面應用程序的強大 UI 框架。它融合了矢量圖形、動畫、多媒體等多種技術&#xff0c;能讓開發者創建出具有高度視覺吸引力和交互性的應用…

DICOM醫學影像數據訪問控制與身份驗證技術應用的重要性及其實現方法詳解

DICOM醫學影像數據訪問控制與身份驗證技術應用的重要性及其實現方法詳解 在現代醫療體系中,DICOM(數字成像和通信醫學標準)作為醫學影像數據的核心標準,扮演著至關重要的角色。隨著醫療信息化的深入發展,DICOM醫學影像數據的安全性和隱私保護成為醫療機構亟需解決的關鍵問…

植物知識分享論壇畢設

1.這四個文件直接是什么關系&#xff1f;各自都是什么作用&#xff1f;他們之間是如何聯系的&#xff1f; 關系與聯系 UserController.java 負責接收外部請求&#xff0c;調用 UserService.java 里的方法來處理業務&#xff0c; 而 UserService.java 又會調用 UserMapper.jav…

Business processes A bridge to SAP and a guide to SAP TS410 certification

Business processes A bridge to SAP and a guide to SAP TS410 certification

算法 之 ST表

文章目錄 區間最大值 ST表(Sparse Table)是一種高效處理靜態數據區間查詢的數據結構&#xff0c;主要的作用是用于快速查詢區間的最值&#xff0c;區間GCD,區間按位與或 在這里以區間最大值為例子說明st表的模版 總體的思想就是定義dp[i][j]表示下標為i長度為2^j的區間的最大值…

Deepseek X 文心智能體:諧音梗廣告創意大師

體驗鏈接 飛書文檔 一、引言 在當今競爭激烈的市場環境下&#xff0c;廣告創意對于產品或服務的推廣至關重要。諧音廣告以其獨特的語言魅力&#xff0c;能夠迅速吸引受眾的注意力并留下深刻印象。本智能體旨在利用 DeepSeek 模型強大的語言分析和推理能力&#xff0c;為用戶…

libilibi項目優化(2)視頻文件分塊上傳

第一版 文件分片上傳過程總結 整個文件分片上傳過程分為三個主要步驟&#xff1a;預上傳、分片上傳和獲取已上傳分塊信息。以下是每個步驟的詳細描述&#xff1a; 1. 預上傳&#xff08;preUploadVideo&#xff09; 功能&#xff1a;生成唯一的上傳 ID&#xff0c;并將文件…

TCP簡單鏈接的編程實現

TCP簡單鏈接的編程實現 本文主要介紹TCP應用層的編碼實現。 TCP是一種面向連接的、可靠的、基于字節流的傳輸層協議&#xff0c;它是互聯網協議套件&#xff08;TCP/IP&#xff09;中的核心協議之一&#xff0c;廣泛應用于需要可靠數據傳輸的場景&#xff0c;如&#xff1a;網…

使用Multiprocessing模塊創建子進程,需要放到__main__中

1 場景說明 在Python中&#xff0c;使用multiprocessing模塊創建子進程時&#xff0c;將創建子進程的代碼放在if __name__ __main__: 塊之外&#xff0c;如下面代碼&#xff1a; import multiprocessing import timedef test_func(name):print(f"子進程 {name} 開始運行…

描述<canvas>標簽的主要用途,如何在其上繪制簡單圖形?

大白話描述標簽的主要用途&#xff0c;如何在其上繪制簡單圖形&#xff1f; <canvas> 標簽的主要用途 <canvas> 標簽是 HTML5 中新增的一個標簽&#xff0c;它就像是一塊“畫布”&#xff0c;你可以在網頁上用它來繪制各種圖形、動畫、制作游戲等。簡單來說&…

【RHCE實驗】搭建主從DNS、WEB等服務器

目錄 需求 環境搭建 配置nfs服務器 配置web服務器 配置主從dns服務器 主dns服務器 從dns服務器 配置客戶端 客戶端測試 需求 客戶端通過訪問 www.nihao.com 后&#xff0c;能夠通過 dns 域名解析&#xff0c;訪問到 nginx 服務中由 nfs 共享的首頁文件&#xff0c;內容…

Shell條件判斷

一、使用if選擇結構 if單分支的語法組成&#xff1a; if 條件測試;then 命令序列 fi if雙分支的語法組成&#xff1a; if 條件測試;then 命令序列1 else 命令序列2 fi if多分支的語法組成&#xff1a; if 條…

理解langchain langgraph 官方文檔示例代碼中的MemorySaver

以下是langchain v0.3官方示例代碼 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解為&#xff1a;定義一個流程&#xff0c;這個流程中用到的數據類型是Messages。 <---定義一個有向圖&…

【HarmonyOS Next之旅】DevEco Studio使用指南(三)

目錄 1 -> 一體化工程遷移 1.1 -> 自動遷移 1.2 -> 手動遷移 1.2.1 -> API 10及以上歷史工程遷移 1.2.2 -> API 9歷史工程遷移 1 -> 一體化工程遷移 DevEco Studio從 NEXT Developer Beta1版本開始&#xff0c;提供開箱即用的開發體驗&#xff0c;將SD…