TypeScript 中的字面量類型(Literal Types)

在 TypeScript 中,字面量類型(Literal Types)是一種特殊的類型,它允許你將變量的類型限制為某個具體的值(如特定的字符串、數字或布爾值),而不僅僅是寬泛的類型(如?stringnumber)。字面量類型通常與聯合類型(Union Types)結合使用,用于創建更精確的類型約束。

一、字面量類型的三種形式

1.?字符串字面量類型

將變量的類型限制為特定字符串值

let direction: "up" | "down" | "left" | "right";
direction = "up";    // ? 合法
direction = "north"; // ? 錯誤:不能將類型 'north' 分配給類型 '"up" | "down" | "left" | "right"'
2.?數字字面量類型

將變量的類型限制為特定數值

let httpStatusCode: 200 | 404 | 500;
httpStatusCode = 200; // ? 合法
httpStatusCode = 403; // ? 錯誤:不能將類型 '403' 分配給類型 '200 | 404 | 500'
3.?布爾字面量類型

將變量的類型限制為?true?或?false(實際用途較少,因為直接使用?boolean?更常見):

let isDone: true;
isDone = true;  // ? 合法
isDone = false; // ? 錯誤:不能將類型 'false' 分配給類型 'true'

二、字面量類型的應用場景

1.?函數參數的精確類型約束
function setAlignment(align: "left" | "center" | "right") {// ...
}setAlignment("center"); // ? 合法
setAlignment("justify"); // ? 錯誤
2.?狀態機或配置對象
type ButtonState = "enabled" | "disabled" | "loading";const button: { state: ButtonState } = {state: "enabled" // 只能是三種狀態之一
};
3.?類型守衛與條件類型

結合類型守衛,根據字面量類型執行不同邏輯:

type Shape = | { kind: "circle"; radius: number }| { kind: "square"; sideLength: number };function getArea(shape: Shape) {if (shape.kind === "circle") {return Math.PI * shape.radius ** 2; // TypeScript 知道 shape 是圓形}// 無需 else 分支,TypeScript 自動推導 shape 是方形return shape.sideLength ** 2;
}

三、字面量類型與聯合類型的結合

字面量類型的強大之處在于與聯合類型結合,創建更靈活的類型系統:

type ResponseFormat = "json" | "xml" | { custom: string };function fetchData(format: ResponseFormat) {if (typeof format === "string") {// format 是 "json" 或 "xml"} else {// format 是 { custom: string }}
}

四、字面量類型的推斷與縮小

1.?類型推斷
// 推斷為 "hello"(字符串字面量類型)
const greeting = "hello";// 推斷為 string(因為變量可重新賦值)
let message = "hello";
message = "world"; // 合法
2.?類型縮小(Type Narrowing)

通過條件判斷將寬泛類型縮小為字面量類型:

function printID(id: number | string) {if (typeof id === "string") {console.log(id.toUpperCase()); // id 被縮小為 string 類型} else {console.log(id.toFixed(2));    // id 被縮小為 number 類型}
}

五、字面量類型的進階用法

1.?模板字面量類型(Template Literal Types)

基于字符串字面量組合出新的類型:

type Color = "red" | "blue";
type Size = "small" | "large";
type ProductID = `${Color}-${Size}`; // "red-small" | "red-large" | "blue-small" | "blue-large"
2.?字面量類型與枚舉(Enum)的對比
  • 枚舉:編譯后存在于運行時,可被修改。
  • 字面量類型:僅存在于類型系統,編譯后消失,更輕量。
// 枚舉
enum Direction { Up, Down, Left, Right }
const d: Direction = Direction.Up;// 字面量類型
type DirectionLiteral = "up" | "down" | "left" | "right";
const dl: DirectionLiteral = "up";

總結:字面量類型的核心價值

  • 精確性:將變量類型約束到具體值,增強類型安全性。
  • 可讀性:代碼中明確聲明允許的值,減少歧義。
  • 與其他特性結合:聯合類型、條件類型、模板字面量類型等,構建復雜類型系統。

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

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

相關文章

晶臺光耦在手機PD快充上的應用

光耦(光電隔離器)作為關鍵電子元件,在手機PD快充中扮演信號隔離與傳輸的“安全衛士”。其通過光信號實現電氣隔離,保護手機電路免受高電壓損害,同時支持實時信號反饋,優化充電效率。 晶臺品牌推出KL817、KL…

python學習打卡day43

DAY 43 復習日 作業: kaggle找到一個圖像數據集,用cnn網絡進行訓練并且用grad-cam做可視化 浙大疏錦行 數據集使用貓狗數據集,訓練集中包含貓圖像4000張、狗圖像4005張。測試集包含貓圖像1012張,狗圖像1013張。以下是數據集的下…

大數據與數據分析【數據分析全棧攻略:爬蟲+處理+可視化+報告】

- 第 100 篇 - Date: 2025 - 05 - 25 Author: 鄭龍浩/仟墨 大數據與數據分析 文章目錄 大數據與數據分析一 大數據是什么?1 定義2 大數據的來源3 大數據4個方面的典型特征(4V)4 大數據的應用領域5 數據分析工具6 數據是五種生產要素之一 二 …

uniapp 開發企業微信小程序,如何區別生產環境和測試環境?來處理不同的服務請求

在 uniapp 開發企業微信小程序時,區分生產環境和測試環境是常見需求。以下是幾種可靠的方法,幫助你根據環境處理不同的服務請求: 一、通過條件編譯區分(推薦) 使用 uniapp 的 條件編譯 語法,在代碼中標記…

青少年編程與數學 02-020 C#程序設計基礎 15課題、異常處理

青少年編程與數學 02-020 C#程序設計基礎 15課題、異常處理 一、異常1. 異常的分類2. 異常的作用小結 二、異常處理1. 異常處理的定義2. 異常處理的主要組成部分3. 異常處理的作用小結 三、C#異常處理1. 異常的基本概念2. 異常處理的關鍵字3. 異常處理的流程4. 自定義異常5. 異…

云原生時代 Kafka 深度實踐:05性能調優與場景實戰

5.1 性能調優全攻略 Producer調優 批量發送與延遲發送 通過調整batch.size和linger.ms參數提升吞吐量: props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384); // 默認16KB props.put(ProducerConfig.LINGER_MS_CONFIG, 10); // 等待10ms以積累更多消息ba…

在 Dify 項目中的 Celery:異步任務的實現與集成

Celery 是一個強大而靈活的分布式任務隊列系統,旨在幫助應用程序在后臺異步運行耗時的任務,提高系統的響應速度和性能。在 Dify 項目中,Celery 被廣泛用于處理異步任務和定時任務,并與其他工具(如 Sentry、OpenTelemet…

Pytorch Geometric官方例程pytorch_geometric/examples/link_pred.py環境安裝教程及圖數據集制作

最近需要訓練圖卷積神經網絡(Graph Convolution Neural Network, GCNN),在配置GCNN環境上總結了一些經驗。 我覺得對于初學者而言,圖神經網絡的訓練會有2個難點: ①環境配置 ②數據集制作 一、環境配置 我最初光想…

2025年微信小程序開發:AR/VR與電商的最新案例

引言 微信小程序自2017年推出以來,已成為中國移動互聯網生態的核心組成部分。根據最新數據,截至2025年,微信小程序的日活躍用戶超過4.5億,總數超過430萬,覆蓋電商、社交、線下服務等多個領域(WeChat Mini …

互聯網向左,區塊鏈向右

2008年,中本聰首次提出了比特幣的設想,這打開了去中心化的大門。 比特幣白皮書清晰的描述了去中心化支付的解決方案,并分別從以下幾個方面闡述了他的理念: 一、由轉賬雙方點對點的通訊,而不通過中心化的第三方&#xf…

PV操作的C++代碼示例講解

文章目錄 一、PV操作基本概念(一)信號量(二)P操作(三)V操作 二、PV操作的意義三、C中實現PV操作的方法(一)使用信號量實現PV操作代碼解釋: (二)使…

《對象創建的秘密:Java 內存布局、逃逸分析與 TLAB 優化詳解》

大家好呀!今天我們來聊聊Java世界里那些"看不見摸不著"但又超級重要的東西——對象在內存里是怎么"住"的,以及JVM這個"超級管家"是怎么幫我們優化管理的。放心,我會用最接地氣的方式講解,保證連小學…

簡單實現Ajax基礎應用

Ajax不是一種技術,而是一個編程概念。HTML 和 CSS 可以組合使用來標記和設置信息樣式。JavaScript 可以修改網頁以動態顯示,并允許用戶與新信息進行交互。內置的 XMLHttpRequest 對象用于在網頁上執行 Ajax,允許網站將內容加載到屏幕上而無需…

詳解開漏輸出和推挽輸出

開漏輸出和推挽輸出 以上是 GPIO 配置為輸出時的內部示意圖,我們要關注的其實就是這兩個 MOS 管的開關狀態,可以組合出四種狀態: 兩個 MOS 管都關閉時,輸出處于一個浮空狀態,此時他對其他點的電阻是無窮大的&#xff…

Matlab實現LSTM-SVM回歸預測,作者:機器學習之心

Matlab實現LSTM-SVM回歸預測,作者:機器學習之心 目錄 Matlab實現LSTM-SVM回歸預測,作者:機器學習之心效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 代碼主要功能 該代碼實現了一個LSTM-SVM回歸預測模型,核心流…

Leetcode - 周賽 452

目錄 一,3566. 等積子集的劃分方案二,3567. 子矩陣的最小絕對差三,3568. 清理教室的最少移動四,3569. 分割數組后不同質數的最大數目 一,3566. 等積子集的劃分方案 題目列表 本題有兩種做法,dfs 選或不選…

【FAQ】HarmonyOS SDK 閉源開放能力 —Account Kit(5)

1.問題描述: 集成華為一鍵登錄的LoginWithHuaweiIDButton, 但是Button默認名字叫 “華為賬號一鍵登錄”,太長無法顯示,能否簡寫成“一鍵登錄”與其他端一致? 解決方案: 問題分兩個場景: 一、…

Asp.Net Core SignalR的分布式部署

文章目錄 前言一、核心二、解決方案架構三、實現方案1.使用 Azure SignalR Service2.Redis Backplane(Redis 背板方案)3.負載均衡配置粘性會話要求無粘性會話方案(僅WebSockets)完整部署示例(Redis Docker)性能優化技…

L2-054 三點共線 - java

L2-054 三點共線 語言時間限制內存限制代碼長度限制棧限制Java (javac)2600 ms512 MB16KB8192 KBPython (python3)2000 ms256 MB16KB8192 KB其他編譯器2000 ms64 MB16KB8192 KB 題目描述: 給定平面上 n n n 個點的坐標 ( x _ i , y _ i ) ( i 1 , ? , n ) (x\_i…

【 java 基礎知識 第一篇 】

目錄 1.概念 1.1.java的特定有哪些? 1.2.java有哪些優勢哪些劣勢? 1.3.java為什么可以跨平臺? 1.4JVM,JDK,JRE它們有什么區別? 1.5.編譯型語言與解釋型語言的區別? 2.數據類型 2.1.long與int類型可以互轉嗎&…