」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 理解 TypeScript 中的“#any&#”、“#unknown&#”和“#never&#”

理解 TypeScript 中的“#any&#”、“#unknown&#”和“#never&#”

發佈於2024-08-07
瀏覽:159

Understanding

TypeScript 提供了強大的型別系統,但某些類型可能會令人困惑,即「any」、「unknown」和「never」。讓我們將它們分解以便更好地理解。

任意類型

any 類型是這三種類型中最簡單的。它本質上禁用類型檢查,允許變數保存任何類型的值。例如:

let value: any;
value = 42;             // number
value = "Hello";        // string
value = [1, 2, 3];      // array
value = () => {};       // function
value = { key: "val" }; // object
value = new Date();     // date

在所有這些情況下,TypeScript 不會引發任何錯誤,允許我們在沒有類型限制的情況下對變數執行任何操作。這在將 JavaScript 專案遷移到 TypeScript 時非常有用。然而,依賴 any 會抵消類型安全的好處,使其在大多數情況下成為一個糟糕的選擇。相反,請考慮使用未知。

未知類型

未知類型比任何類型都更安全,因為它在執行操作之前需要進行類型檢查。它表示所有可能值的集合,但強制執行類型安全。

let value: unknown;
value = 42;
value = "Hello";

// To perform operations, we need to narrow down the type
if (typeof value === "number") {
  console.log(value   1); // TypeScript knows value is a number here
}

使用unknown對於接受任何類型輸入的函數(例如日誌記錄函數)是有益的,因為它在繼續操作之前強制執行類型檢查。

永不類型

never 類型表示空值集,表示某些事情永遠不應該發生。不能為 never 類型指派任何值,這使得它對於詳盡檢查和表示無法存取的程式碼非常有用。

type User = { type: "admin" } | { type: "standard" };

function handleUser(user: User) {
  switch (user.type) {
    case "admin":
      // handle admin
      break;
    case "standard":
      // handle standard
      break;
    default:
      const _exhaustiveCheck: never = user;
      // This ensures all cases are handled
  }
}

如果新增新的使用者類型,TypeScript 將引發錯誤,確保所有情況都已解決,這對於在程式碼中維護詳盡的檢查來說永遠是無價的。

結論

理解任何未知的、永遠不會增強 TypeScript 的型別安全性。謹慎使用any,喜歡使用unknown來進行更安全的類型檢查,並利用never來進行詳盡的檢查和無法訪問的代碼。如果正確使用這些類型,TypeScript 將成為建立可靠應用程式的強大工具。
快樂編碼!

版本聲明 本文轉載於:https://dev.to/sharoztanveer/understanding-any-unknown-and-never-in-typescript-4acb?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何將項目添加到Ienumerable中?
    如何將項目添加到Ienumerable中?
    [2收藏。但是,這不能做到,因為Ienumerable 不一定代表可變的收藏。它甚至可能根本不代表集合。 { 字符串s; 做 { S = Console.Readline(); 收益回報s; } while(!strin...
    程式設計 發佈於2025-02-07
  • 對象擬合:IE和Edge中的封面失敗,如何修復?
    對象擬合:IE和Edge中的封面失敗,如何修復?
    解決此問題,我們採用了一個巧妙的CSS解決方案來解決問題:高度:100%; 高度:auto ; 寬度:100%; //對於水平塊 ,使用絕對定位將圖像定位在中心,以object-fit:object-fit :cover in IE和edge消除了問題。現在,圖像將按比例擴展,保持所需的效果而不...
    程式設計 發佈於2025-02-07
  • 如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    [2使用內置的char_length()function。 char_length()和length() 此查詢將從指定的表中檢索所有行,並基於上升順序對它們進行排序指定列的字符長度。帶有更長字符串的行將出現在結果的底部。
    程式設計 發佈於2025-02-07
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 // error:“ coss redeclare foo()” 但是,php工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活...
    程式設計 發佈於2025-02-07
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本號的替代方法,它是使用以下語法: https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js(google hosted...
    程式設計 發佈於2025-02-07
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    克服go mod中的模塊路徑差異 coreos/bbolt:github.com/coreos/ [email受保護]:解析go.mod:模塊將其路徑聲明為:go.etcd.io/bbolt `要解決此問題,您可以在go.mod文件中使用替換指令。只需在go.mod的末尾添加以下行:[&& &...
    程式設計 發佈於2025-02-07
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    在嘗試將image存儲在mysql數據庫中時,您可能會遇到一個可能會遇到問題。本指南將提供成功存儲您的圖像數據的解決方案。 easudy values('$ this-> ; image_id','file_get_contents($ tmp_imag...
    程式設計 發佈於2025-02-07
  • 如何可靠地檢查MySQL表中的列存在?
    如何可靠地檢查MySQL表中的列存在?
    在mySQL中確定列中的列存在,驗證表中的列存在與與之相比有點困惑其他數據庫系統。常用的方法:如果存在(從信息_schema.columns select * * where table_name ='prefix_topic'和column_name =&...
    程式設計 發佈於2025-02-07
  • 如何在沒有錯誤的情況下在Python中創建空的凹痕塊?
    如何在沒有錯誤的情況下在Python中創建空的凹痕塊?
    在編寫python 但是,在某些情況下,您可能需要創建一個空的凹痕塊來捕獲和丟棄異常而不明確處理它們。為了實現這一目標,您可以使用“通過”語句。 Pass語句是Python中的空操作。將其放置在縮進塊中時,它充當佔位符,允許解釋器在不執行任何實際代碼的情況下正確地識別該塊。 嘗試: #在...
    程式設計 發佈於2025-02-07
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源 考慮以下代碼: < pre> import pytz [&& &&&&&&華&& && && && &&&華dt2 = hk.localize(dateTime(2012,1...
    程式設計 發佈於2025-02-07
  • 如何在保持鼠標輪和箭頭鑰匙滾動的同時隱藏滾動條?
    如何在保持鼠標輪和箭頭鑰匙滾動的同時隱藏滾動條?
    在通過鼠標輪和箭頭鍵啟用滾動時隱藏scrollbars A:要完成此操作,請按照以下步驟:使用CSSS屬性溢出:隱藏在目標div或身體上隱藏滾動條。 模仿鼠標輪滾動: javaScript或jquery。 在函數中,修改目標div的scrolltop屬性以仿真滾動。 : 綁定鍵盤事件(而不是...
    程式設計 發佈於2025-02-07
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在java中的多個返回類型:一個誤解介紹,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但是,情況確實如此嗎? 通用方法:拆開神秘 [方法僅具有單一的返回類型。相反,它採用機制,如鑽石符號“ ”。 分解方法簽名: :本節定義了一個通用類型參數,E。它表示該方法接受了擴展foo類...
    程式設計 發佈於2025-02-07
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mysql組使用mysql組來調整查詢結果。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的基於列的轉換。通過子句以及條件匯總函數,例如總和或情況。讓我們考慮以下查詢: select d.data_timestamp, sum(data_id = 1 tata...
    程式設計 發佈於2025-02-07
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError:SomeClass實...
    程式設計 發佈於2025-02-07
  • 我可以在CSS中使用SVG作為偽元素嗎?
    我可以在CSS中使用SVG作為偽元素嗎?
    使用svgs用作pseudo-element content css content properts允許在使用元素之前或之後使用元素插入各種類型的內容偽元素,例如::之前和::之後。但是,對可以包括哪些內容有限制。 可以將svgs用作pseudo-element Content? ,現在可以使...
    程式設計 發佈於2025-02-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3