[TS手冊學習] 02_類型收窄 Narrowing

来源:https://www.cnblogs.com/feixianxing/archive/2023/11/29/typescript-handbook-type-narrowing.html
-Advertisement-
Play Games

一個變數如果聲明為聯合類型,而後續操作需要針對其具體的單一類型做不同處理,這個過程就叫做類型收窄(`Narrowing`) ...


TS官方手冊:TypeScript: Handbook - The TypeScript Handbook (typescriptlang.org)

一個變數如果聲明為聯合類型,而後續操作需要針對其具體的單一類型做不同處理,這個過程就叫做類型收窄(Narrowing)。

常見的做法或情形有以下:

typeof 類型保護(type guards)

typeof是 JS 中的操作符,需要註意typeof對象、數組、null都會返回object

真值收窄(Truthiness narrowing)

0NaN""0nnullundefined都會被隱式轉換為false,屬於假值,其它的值是真值。依據這個規則也可以收窄類型。

等值收窄(Equality narrowing)

在 JS 中,全等判斷符===要求兩邊類型一致,以此也可以排除一些類型,從而實現收窄類型。

in 操作符收窄

in操作符檢查指定的屬性是否在指定的對象或其原型鏈中。

instanceof 收窄

instanceof運算符用於檢測構造函數的 prototype 屬性是否出現在某個實例對象的原型鏈上。

賦值語句(Assignments)

TS 可以根據賦值語句的右值的類型收窄左值。

image-20231127221150198

控制流分析(Control flow analysis)

基於可達性的代碼分析就是控制流分析,關註代碼中的ifwhile等條件控制語句。

如果代碼達到了某個區域,而根據條件控制語句可以得知:如果變數X是類型A,無法到達此區域,那麼就可以推斷出到達此區域的變數X的類型不可能是A。

於是類型收窄。

function padLeft(padding: number | string, input: string) {
  if (typeof padding === "number") {
    return new Array(padding + 1).join(" ") + input;
  }
  return padding + input;
}

在第一個 if 語句里,因為有 return 語句,TypeScript 就能通過代碼分析,判斷出在剩餘的部分 return padding + input ,如果 padding 是 number 類型,是無法達到 (unreachable) 這裡的,所以在剩餘的部分,就會將 number類型從 number | string 類型中刪除掉。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、系統用戶管理 用戶的分類(用戶的ID): UID:用戶的身份標識符,每個用戶都會被分配一個獨特的ID 系統用戶(服務用戶):0 ~ 999 之間 普通用戶:1000 ~ 6000之間 用戶名和UID信息通常存儲在/etc/passwd文件中 用戶的存在是為了能更好的控制系統許可權 1 root:x ...
  • 在Linux或Unix下,如果你看見別人使用kill %1 或者kill %n (n為一個具體的數字)命令,你知道kill %n 這種帶%號的用法是幹嘛嗎?其實kill %n 表示kill掉後臺程式(也可以說是作業),其中n表示Job的編號(number),而不是進程的進程號,下麵我們來簡單演示一下 ...
  • 硬體:一個樹莓派4B、一臺筆記本電腦(以win10系統為例,做樹莓派顯示屏) 1 下載工具軟體 1.1 下載樹莓派鏡像燒錄器Raspberry Pi Imager。 該軟體是把Raspberry Pi OS安裝(燒錄)到TD卡上的工具。 樹莓派官網鏈接。根據下載Raspberry Pi Imager ...
  • 飛騰E2000板載乙太網適配e20005.4.18macbyt85211. 設備樹移植2. MACB驅動移植3. 網路連通性調試3-1. MACB驅動環回測試3-2. YT8521 PHY工作模式及電壓確認3-3. YT8521 PHY環回測試3-4. YT8521 PHY tx delay調整 飛 ...
  • 只是記錄一些我認為比較有用而且容易忘記的操作,主要系統為CentOS CentOS yum使用鏡像源 sudo yum install epel-release (虛擬機)使用主機代理 使用ip route show查看預設路由埠 設置代理: #添加Proxy代理信息(其中username和pas ...
  • SQL HAVING子句 HAVING子句被添加到SQL中,因為WHERE關鍵字不能與聚合函數一起使用。 HAVING語法 SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) HAVING con ...
  • 稀疏索引 密集索引:文件中的每個搜索碼值都對應一個索引值,就是葉子節點保存了整行. 稀疏索引:文件只為索引碼的某些值建立索引項. 稀疏索引的創建過程包括將集合中的元素分段,並給每個分段中的最小元素創建索引。在搜索時,先定位到第一個大於搜索值的索引的前一個索引,然後從該索引所在的分段中從前向後順序遍歷 ...
  • WebSocket 是一種用於實現持久連接的通信協議,它的原理和工作方式相對複雜,但我們可以嘗試以儘可能簡單和清晰的方式來解釋它。 WebSocket 的原理 在理解 WebSocket 的工作原理之前,我們首先要瞭解 HTTP 協議的短連接性質。在傳統的 HTTP 通信中,客戶端發送一個請求到服務 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...