[TS手冊學習] 01_基礎、常見類型與概念

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

TS官方Handbook: TypeScript: Handbook - The TypeScript Handbook (typescriptlang.org) 基礎 相關概念 運行時錯誤:JS 的大多數錯誤都只能在運行的過程中被髮現。 靜態類型系統:TS 可以在運行代碼之前發現錯誤。 非異常失敗 ...


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

基礎

相關概念

  • 運行時錯誤:JS 的大多數錯誤都只能在運行的過程中被髮現。

  • 靜態類型系統:TS 可以在運行代碼之前發現錯誤。

  • 非異常失敗:例如在 JS 中訪問一個對象不存在的屬性,不會導致異常,而是返回undefined,這種情況就是非異常失敗,容易被忽略。

  • 類型工具:TS 可以通過類型聲明,在訪問變數或者其它屬性的時候提供代碼補全和錯誤信息提示。

TypeScript編譯器 tsc

使用npm全局安裝

npm install -g typescript

執行tsc demo.ts可以將ts文件編譯為js文件,並及時發現錯誤,而不是等待 JS 代碼執行時。

報錯時仍產出文件

TypeScript 的核心原則:大多數時候,開發人員比 TypeScript 更瞭解代碼。

當tsc編譯過程中檢測到報錯,仍會產出js文件。

這一特性可以方便將 JS 項目遷移到 TS,原先的 JS 項目本就是可以運行的,不需要完全更改到符合 TS 的標準(工作量太大了)。

如果需要更嚴格的編譯,可以使用noEmitOnError編譯選項。

tsc --noEmitOnError demo.ts

顯示類型與類型標註

通過冒號加類型的方式給變數標註類型。

function greet(person: string, date: Date) {
  console.log(`Hello ${person}, today is ${date.toDateString()}!`);
}

擦除類型與降級

  • 擦除類型: 在編譯過程中,類型標註會被擦除,因為類型標註不是 JS 的語法特性,不被瀏覽器支持,這也是使用 TS 需要使用編譯器將代碼編譯為 JS 的原因。

  • 降級:TS 可以將高版本 ECMAScript的代碼重寫為低版本(ES3或者ES5)的代碼。預設降級到ES3,可以使用target選項指定版本轉換,例如:tsc --target es2015 demo.ts.

雖然預設的目標代碼採用的是 ES3 語法,但現在瀏覽器大多數都已經支持 ES2015 了。

所以,大多數開發者可以安全地指定目標代碼採用 ES2015 或者是更高的 ES 版本,除非你需要著重相容某些古老的瀏覽器。

嚴格性

TS 的嚴格性是在一個區間內調節的。

可以在tsconfig.json中通過設置strict: true一次性開啟全部嚴格性設置。

也可以單獨開啟或者關閉某個設置,其中:

  • noImplicitAny:當有變數被隱式地被推斷為any時報錯。

    也就是說需要顯性的指定any(不推薦),或者隱式推斷可以推斷出具體類型,或者手動指定明確的類型(最好)。

  • strictNullCheck:嚴格地處理nullundefined

常見類型與概念

基本類型

與 JS 中一致的:stringnumberboolean

數組

使用type[]或者泛型Array<type>

對象

簡單的對象可以:(複雜的對象用interface聲明)

function printCoord(pt: { x: number; y: number }) {
  console.log("The coordinate's x value is " + pt.x);
  console.log("The coordinate's y value is " + pt.y);
}
printCoord({ x: 3, y: 7 });

聯合類型

使用|分隔多種允許的類型。

類型別名

使用type聲明。

type Point = {
  x: number;
  y: number;
};

type ID = number | string;

介面

interface Point {
  x: number;
  y: number;
}

類型別名和介面之間的區別

類型別名和介面非常相似,在大多數情況下可以在它們之間自由選擇。 幾乎所有的 interface 功能都可以在 type 中使用,關鍵區別在於不能重新開放類型以添加新的屬性,而介面始終是可擴展的。

image-20231126231126628

類型斷言 Type Assertions

考慮到多態的情況,有時候 TS 只能推斷出父類,假如我們明確知道具體的子類,可以使用類型斷言。

如果斷言錯誤,會及時報錯。

// 使用 as 關鍵字
const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;

// 使用<>,這種寫法不能出現在tsx中,會被誤判
const myCanvas = <HTMLCanvasElement>document.getElementById("main_canvas");

// 報錯
const x = "hello" as number;

文字類型 Literal Type

使用varlet聲明的量是變數,因此對應的類型是指定的數據類型。

而使用const聲明的量是常量,本身就不能再改變,TS 將其值作為類型(只適用於stringnumber)。

image-20231127104017113

字元串可以作為類型,於是聯合類型可以聯合多個字元串形成枚舉類型:

let alignment: "left"|"center"|"right" = "center";

使用const聲明對象,對象的內部欄位不會被當作文字類型:

// 這裡的 obj.num 會被推斷為number類型
const obj = {num: 0};

一個較詳細的例子

const req = {url:"https://example.com", method: "GET"};
// 這裡會報錯,因為req.method是string類型,不是"GET"或"POST"類型
handleRequest(req.url, req.method);

// 函數類型聲明
function handleRequest(url:string, method:"GET"|"POST"){...}

修正方法1:使用類型斷言

// Change 1:
const req = { url: "https://example.com", method: "GET" as "GET" };
// Change 2
handleRequest(req.url, req.method as "GET");

change1意味著斷言req.method的類型為"GET",這可以在類型推斷的時候將其視為"GET",而不是更廣泛的string

change2用於斷言傳入的參數的類型為"GET",確保沒有意料之外的錯誤。

修正方法2:使用 as const

const req = { url: "https://example.com", method: "GET" } as const;
handleRequest(req.url, req.method);

req.urlreq.method都會變成文字類型,req.method的類型變成"GET",而req.url的類型變成了"https://example.com",看起來很奇怪,但是這種類型可以視作string類型的子類型,也可以被函數匹配到。

對於null和undefined的處理

建議開啟strictNullChecks,在傳遞值的時候手動檢查是否為nullundefined,或者使用!斷言一個變數非空:

function doSomething(x: string | null) {
  if (x === null) {
    // do nothing
  } else {
    console.log("Hello, " + x.toUpperCase());
  }
}

function liveDangerously(x?: number | null) {
  // No error
  console.log(x!.toFixed());
}

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

-Advertisement-
Play Games
更多相關文章
  • 飛騰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 通信中,客戶端發送一個請求到服務 ...
  • 一個變數如果聲明為聯合類型,而後續操作需要針對其具體的單一類型做不同處理,這個過程就叫做類型收窄(`Narrowing`) ...
  • 項目代碼同步至碼雲 weiz-vue3-template Vue Router 是 Vue.js 的官方路由。它與 Vue.js 核心深度集成,讓用 Vue.js 構建單頁應用變得輕而易舉。 1. 安裝 npm i vue-router@4 2. 集成 1. 新建兩頁面進行示例 在src/view下 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 函數創建與定義的過程 函數定義階段 在堆記憶體中開闢一段空間 把函數體內的代碼一模一樣的存儲在這段空間內 把空間賦值給棧記憶體的變數中 函數調用階段 按照變數名內的存儲地址找到堆記憶體中對應的存儲空間 在調用棧中開闢一個新的函數執行空間 在執行 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...