《TypeScript 快速上手:類型、編譯與嚴格模式的簡明教程》

?


一、TypeScript介紹

在引入編程社區 20 多年后,JavaScript 現在已成為有史以來應用最廣泛的跨平臺語言之一。JavaScript 最初是一種用于向網頁添加微不足道的交互性的小型腳本語言,現已發展成為各種規模的前端和后端應 用程序的首選語言。雖然用 JavaScript 編寫的程序的大小、范圍和復雜性呈指數級增長,但 JavaScript 語言表達不同代碼單元之間關系的能力卻沒有。結合 JavaScript 相當奇特的運行時語義,語言和程序復 雜性之間的這種不匹配使得 JavaScript 開發成為一項難以大規模管理的任務。

程序員編寫的最常見的錯誤類型可以描述為類型錯誤:在預期不同類型的值的地方使用了某種類型的 值。這可能是由于簡單的拼寫錯誤、無法理解庫的 API 表面、對運行時行為的錯誤假設或其他錯誤。 TypeScript 的目標是成為 JavaScript 程序的靜態類型檢查器——換句話說,是一個在代碼運行之前運行 的工具(靜態)并確保程序的類型正確(類型檢查)。 TypeScript 是一種由微軟開發的自由和開源的編程語言。它是 JavaScript 的一個超集,而且本質上向這 個語言添加了可選的靜態類型和基于類的面向對象編程。

總而言之,ts是js的語言擴展,給js提供了一層類型檢查。

二、JS ,ES ,TS的關系

TypeScript 是 JavaScript 的超集,即包含JavaScript 的所有元素,能運行JavaScript 的代碼,并擴展了 JavaScript 的語法。相比于JavaScript ,它還增加了靜態類型、類、模塊、接口和類型注解方面的功能, 更易于大項目的開發。 ?

?

?三、TypeScript 與 JavaScript 的區別

?

四、?TypeScript入門

JavaScript實際中問題?

JavaScript 中的每個值都有一組行為,您可以通過運行不同的操作來觀察。這聽起來很抽象,我們來舉 一個簡單的例子,考慮我們可能對名為 message 的變量運行的一些操作:

// 在 'message' 上訪問屬性 'toLowerCase',并調用它
message.toLowerCase();
// 調用 'message'
message();

如果我們分解它,第一行可運行的代碼訪問一個屬性 toLowerCase ,然后調用它。第二個嘗試 message 直接調用。

但是假設我們不知道 message 。這很常見——我們無法可靠地說出嘗試運行任何這些代碼會得到什么結果。每個操作的行為完全取決于我們最初給 message 的賦值。

  • 可以調用 message 嗎?
  • 它有 toLowerCase 這個屬性嗎?
  • 如果能, toLowerCase 可以調用嗎?
  • 如果這兩個值都是可調用的,它們返回什么?

這些問題的答案通常是我們在編寫 JavaScript 時牢記在心的東西,我們必須希望所有細節都正確。

假設 message 按以下方式定義:

const message = "Hello World!";

正如您可能猜到的,如果我們嘗試運行 message.toLowerCase() ,我們只會得到相同的小寫字符串。 那第二行代碼呢?如果您熟悉 JavaScript,您就會知道這會失敗并出現異常:

TypeError: message is not a function

如果我們能避免這樣的錯誤,那就太好了。

當我們運行我們的代碼時,我們的 JavaScript 運行時選擇做什么的方式是通過確定值的類型——它具有 什么樣的行為和功能。這 TypeError就是暗指的一部分- 它說字符串 "Hello World!" 不能作為函數調用。

TypeScript就用諸多特性為我們解決了困擾我們的問題,我接下來將介紹他們:

靜態類型檢查

回想一下 TypeError 我們之前嘗試將 string 作為函數調用的情況。 大多數人不喜歡在運行他們的代碼 時出現任何類型的錯誤 - 這些被認為是錯誤!當我們編寫新代碼時,我們會盡量避免引入新的錯誤。

理想情況下,我們可以有一個工具來幫助我們在代碼運行之前發現這些錯誤。這就是像 TypeScript 這樣 的靜態類型檢查器所做的。 靜態類型系統描述了當我們運行程序時我們的值的形狀和行為。像 TypeScript 這樣的類型檢查器,告訴我們什么時候事情可能會出軌。

?

非異常故障

例如,規范說嘗試調用不可調用的東西應該拋出錯誤。也許這聽起來像是“明顯的行為”,但您可以想象 訪問對象上不存在的屬性也應該拋出錯誤。相反,JavaScript 給了我們不同的行為并返回值 undefined。

最終,靜態類型系統要求必須調用哪些代碼,應該在其系統中標記,即使它是不會立即拋出錯誤的“有 效”JavaScript。比如:在 TypeScript 中,以下代碼會產生關于 location 未定義的錯誤:

TypeScript 可以在我們的程序中捕獲很多合法的錯誤。

  • 錯別字
  • 未調用的函數
  • 或基本邏輯錯誤

顯式類型

引入一個案例:

hello.ts

function greet(person, date) {console.log(`Hello ${person}, today is ${date}!`);
}greet("hyyyyy");

?到現在為止,我們還沒有告訴 typescript person 或者 date 是什么類型。當我們編輯代碼時會告訴 TypeScript person 是一個 string ,那 date 應該是一個 Date 對象。

有了這個,TypeScript 可以告訴我們其他 greet 可能被錯誤調用的情況。例如修改一下 hello.ts 代 碼:

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

但是:

嗯?TypeScript 在我們的第二個參數上報告了一個錯誤,這是為什么呢? 也許令人驚訝的是, Date() 在 JavaScript 中調用會返回一個 string 。可以使用 new Date() 滿足我們 的期望,快速修復錯誤:?

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

降級編譯

什么是 TypeScript 降級編譯?

TypeScript 降級編譯是指將 TypeScript 代碼編譯為較低版本的 JavaScript 代碼(如 ES5、ES3 等),以確保代碼可以在舊版瀏覽器或環境中運行。

  • ?為什么需要降級編譯?
    • 新版 JavaScript(如 ES6+)引入了許多新特性(如箭頭函數、類、模塊等),但這些特性在舊版瀏覽器(如 IE11)或某些環境中不被支持。
    • 通過降級編譯,可以將這些新特性轉換為舊版 JavaScript 語法,從而確保代碼的兼容性。

?ypeScript 編譯器(tsc)的作用

TypeScript 編譯器(tsc)是 TypeScript 的核心工具,負責將 TypeScript 代碼編譯為 JavaScript 代碼。它支持以下功能:

  • 將 TypeScript 語法轉換為 JavaScript 語法。
  • 支持將代碼降級到指定的 JavaScript 版本(如 ES5、ES3)。
  • 提供類型檢查和錯誤提示。

?目標版本(target)?

在 TypeScript 編譯中,target?是一個關鍵配置選項,用于指定編譯后的 JavaScript 目標版本。例如:

  • es3:將代碼編譯為 ES3 語法(兼容性最好,但代碼體積較大)。
  • es5:將代碼編譯為 ES5 語法(兼容大多數舊版瀏覽器)。
  • es6(或?es2015):將代碼編譯為 ES6 語法(支持現代瀏覽器)。
  • esnext:將代碼編譯為最新版本的 JavaScript。

嚴格模式

不同的用戶使用 TypeScript 在類型檢查器中,希望檢查的嚴格程度不同。

有些人正在尋找更寬松的驗證體驗,它可以幫助僅驗證其程序的某些部分,并且仍然擁有不錯的工具。這是 TypeScript 的默認體驗, 其中類型是可選的,推理采用最寬松的類型,并且不檢查潛在的 null / undefined 值,就像 tsc 面對錯 誤時如何編譯生成JS文件一樣。如果你要遷移現有的 JavaScript,這可能是理想的第一步。

相比之下,許多用戶更喜歡讓 TypeScript 盡可能多地立即驗證,這就是該語言也提供嚴格性設置的原 因。這些嚴格性設置將靜態類型檢查,從開關(無論您的代碼是否被檢查)轉變為更接近于撥號的東西。你把這個撥盤調得越遠,TypeScript 就會為你檢查越多。這可能需要一些額外的工作,但總的來 說,從長遠來看,它是物有所值的,并且可以實現更徹底的檢查和更準確的工具。如果可能,新的代碼 庫應該始終打開這些嚴格性檢查。

TypeScript 有幾個可以打開或關閉的類型檢查嚴格標志,除非另有說明,否則我們所有的示例都將在啟 用所有這些標志的情況下編寫。在命令行里設置 strict ,或在 tsconfig.json 中配置 "strict": true 將它打開。


?

?


?

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

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

相關文章

ROS2 系統架構

1.操作系統層 ros2是基于Linux、Windows、macOS系統建立的,這一層為ros2提供了各種基礎的硬件驅動,比如網卡驅動,常用USB驅動和常用攝像頭驅動等。 2.DDS實現層 ros2的核心通信是采用第三方的通信組件來實現的,這個第三方就是數…

【HTML】二、列表、表格

文章目錄 1、列表1.1 無序列表1.2 有序列表1.3 定義列表 2、表格2.1 定義2.2 表格結構標簽2.3 合并單元格 1、列表 列表分為: 無序列表有序列表定義列表:一個標題下有多個小分類 1.1 無序列表 ul嵌套li,ul是無序列表,li是列表…

redis zset基本介紹以及底層實現

ZSet(Sorted Set)有序集合 介紹 Redis 中的有序集合(Sorted Set)是在集合(Set)的基礎上,為每個成員關聯了一個分數(score)。這個分數可以用來對集合中的成員進行排序。 有序集合保留了集合不能有重復成員的特性(成員不能重復,分值…

政策助力,3C 數碼行業數字化起航

政策引領,數字經濟浪潮來襲 在當今時代,數字經濟已成為全球經濟發展的核心驅動力,引領著新一輪科技革命和產業變革的潮流。我國深刻洞察這一發展趨勢,大力推進數字化經濟發展戰略,為經濟的高質量發展注入了強大動力。 …

IntelliJ IDEA 快捷鍵系列:重命名快捷鍵詳解

目錄 引言一、默認重命名快捷鍵1. Windows 系統?2. Mac 系統? 二、操作步驟與技巧1. 精準選擇重命名范圍?2. 智能過濾無關內容? 三、總結 引言 在代碼重構中,?重命名變量、類、方法? 是最常用的操作之一。正確使用快捷鍵可以極大提升開發效率。本文針對 ?Ma…

文檔搜索引擎

首先獲取很多網頁(爬蟲->一個http客戶端,發送http請求獲取http響應結果(就是網站))(批量化的獲取很多的頁面) 再根據用戶輸入的查詢詞,在網頁中進行查找 用戶輸入查詢詞之后,如何讓查詢詞和當前這些網頁進行匹配 ->使用倒排索引 倒排索引 1.文檔: 每個待搜索的網頁(被爬…

開源工具利器:Mermaid助力知識圖譜可視化與分享

在現代 web 開發中,可視化工具對于展示流程、結構和數據關系至關重要。Mermaid 是一款強大的 JavaScript 工具,它使用基于 Markdown 的語法來呈現可定制的圖表、圖表和可視化。對于展示流程、結構和數據關系至關重要。通過簡單的文本描述,你可…

C# --- LINQ

C# --- LINQ 什么是LINQFluent Syntax 和 SQL-Like QueryLINQ Operations 什么是LINQ LINQ的全稱為Language Integrated Query, 為各種查詢(包括對象查詢,數據庫查詢,XML查詢) 提供了統一模型.LINQ源于SQL,但比SQL更加強大,更加靈…

【AI News | 20250316】每日AI進展

AI Repos 1、ReActMCP 將網絡搜索能力集成到AI助手中的一個MCP服務:ReActMCP Web Search,相當于給AI裝了個搜索引擎,可以實時查找最新的內容。它基于Exa API執行基本和高級網絡搜索,高級搜索比如限制搜索的網站范圍、指定日期范圍…

【VUE】day04-組件的生命周期、組件之間的數據共享、ref引用、購物車案例

【VUE】day04-組件的生命周期、組件之間的數據共享、ref引用、購物車案例 1. 組件之間的關系2. 使用組件的三個步驟3. vue.components全局注冊組件4. 自動生成右邊標簽插件5. 組件的props6. 結合v-bind使用自定義屬性7. props的默認default值8. type值類型9. 組件之間的樣式沖突…

Redis分布式鎖深度剖析:從原理到Redisson實戰,破解腦裂與高并發鎖難題

一、📌 分布式鎖的核心應用場景 場景類型典型案例風險說明🚀 高并發場景電商秒殺、票務搶購庫存超賣風險? 定時任務場景集群日志清理、數據統計任務重復執行🔄 冪等場景支付接口重試、訂單創建資金重復扣款 二、🔧 Redis分布式鎖…

量化交易學習筆記02:雙均線策略

雙均線策略示例 個股:中國平安 回測日期:2022-5-1至2023-5-1 短均線:5天 長無線:10天 代碼: def initialize(context):# 初始化此策略# 設置我們要操作的股票池, 這里我們只操作一支股票# """標的&qu…

交換機控制軟件的實現步驟猜測

一、主要目的 提出對交換機軟件控制邏輯的猜測。 二、交換機控制軟件的組成 (一)背景 1、交換機有很多的RJ45水晶頭端口。 2、每個端口支持同時發送和接收字節數據。 3、每個端口接收的數據需要查表后才能轉發給目標端口。 (二)端口狀態掃描線程 負責掃描每個端口的狀態&#x…

Part1:基于國內源完成Kubernetes集群部署

集群規劃 操作系統:CentOS7 內核版本:5.4(需升級) 組件版本說明操作系統內核5.4RPM方式升級docker26.1.4yum安裝cri-docker0.3.16二進制安裝kubeadm1.30.11yum安裝kubealet1.30.11yum安裝kubectl1.30.11yum安裝kubectl1.30.11yu…

中考英語之10難點單詞

A abandon ~動詞,意為 “拋棄;放棄”。 ~例如 He abandoned his old bike by the roadside.(他把他的舊自行車扔在路邊。) absolute ~形容詞,“絕對的;完全的”。 ~例如 We have absolute trust in him…

【GPT入門】第24課 langfuse介紹

【GPT入門】第24課 langfuse介紹 1. langfuse概念與作用2. 代碼3. 頁面效果4. 設計模式1. 裝飾器模式2. 上下文管理模式1. langfuse概念與作用 Langfuse是一款專為大規模語言模型(LLM)應用開發設計的開源平臺。其作用主要包括以下幾個方面: 提升開發效率:通過消除LLM應用構…

在 React 中使用 Web Components 的實踐操作

前言 在現代前端開發中,React 和 Web Components 都是廣泛使用且備受歡迎的技術。React 是一個用于構建用戶界面的 JavaScript 庫,提供了組件化的開發方式和高效的狀態管理,而 Web Components 是一套原生的瀏覽器技術標準,允許開…

C++單例模式精解

單例模式(重點*) 單例模式是23種常用設計模式中最簡單的設計模式之一,它提供了一種創建對象的方式,確保只有單個對象被創建。這個設計模式主要目的是想在整個系統中只能出現類的一個實例,即一個類只有一個對象。 將單…

【微服務】java中http調用組件深入實戰詳解

目錄 一、前言 二、http調用概述 2.1 什么是http調用 2.1.1 http調用步驟 2.2 HTTP調用特點 2.3 HTTP調用應用場景 三、微服務場景下http調用概述 3.1 微服務開發中http調用場景 3.2 微服務組件中http的應用 四、常用的http調用組件 4.1 java中常用的http組件介紹 4…

Implementing SAP BPC Embedded - 2nd Edition

Implementing SAP BPC Embedded - 2nd Edition