文章目錄
前言
二、TypeScript的優勢體現在哪里?
1、執行時間上的區別
2、基礎數據類型區別
3、TS優勢
三、TypeScript的關鍵特性
四、TypeScript的類型系統
1、什么是類型注釋?
2、類型系統核心 - 常用類型
1)?基本類型(原始類型):? ??
數字(Number)?
字符串(String)
布爾值(Boolean)
Null 和 Undefined?
Symbol
疑問
1、--strictNullChecks標志是什么?
2、--strictNullChecks標志默認是啟動的嗎?如何關閉
總結
前言
提示:該文章主要記錄一下TypeScript學習筆記及使用體驗,會不斷豐富更新學習及使用過程中遇到的情況:
一、TypeScript是什么?
TypeScript 是一種由 Microsoft 開發的開源語言。TypeScript與JavaScript有著不同尋常的關系。它是 JavaScript 的一個超集,添加了可選的靜態類型和基于類的面向對象編程。 TypeScript 提供了JavaScript的所有功能,并且額外增加了:類型系統。
簡單可以概述為:
TypeScript(簡稱:TS)是 JavaScript(簡稱:JS)的超集(JS 有的 TS 都有);
TypeScript = Type + JavaScript(在 JS 基礎之上,為 JS 添加了類型支持);
?
二、TypeScript的優勢體現在哪里?
1、JS 代碼中絕大部分錯誤都是 類型 錯誤(Uncaught Type Error);2、在VSCode中,會先編譯代碼,后執行代碼;
1、執行時間上的區別
在我們使用VSCode開發過程中不難發現,JS 屬于動態類型的編程語言,是在執行期對代碼做類型檢查,這樣開發過程中就需要等到代碼真正去執行的時候才能發現錯誤,這時候再去定位并修改bug,相對來說就有點晚了,還會耽誤很多時間。
然而經過學習使用會發現,TS屬于靜態類型的編程語言,是在編譯期做類型檢查,這時在代碼編譯的時候(代碼執行前)就會發現錯誤,這樣可以在編寫代碼的同時就發現代碼中的錯誤,它可以高亮代碼中的意外行為,從而降低出現錯誤的可能性。
2、基礎數據類型區別
JS基礎數據類型(TS包含):
- 原始類型:number/string/boolean/null/undefined/symbol;
- 對象類型:object(包括,數組、對象、函數等對象);
- 聯合類型、自定義類型(類型別名)、接口、元組、字面量類型、枚舉、void、any 等。
3、TS優勢
- 所有的 JS 代碼都是 TS 代碼;
- 開發過程中任何位置的代碼都會有相應的 代碼提示 ,增強了開發體驗;
- 可在代碼編寫時 顯示標記出代碼中的意外行為 , 降低出現錯誤的可能性 ,提升開發效率;
- 豐富的 類型系統 提升了代碼的可維護性,使得 重構代碼更加容易 ;
- 類型推斷 機制, 不需要 在代碼中的 每個地方都顯示標注類型 ;
- 支持 最新的 ECMAScript 語法 ;
- 支持 多種框架的使用;
三、TypeScript的關鍵特性
以下是一些 TS?的關鍵特性:
- 靜態類型檢查:在代碼運行之前,TS編譯器會檢查類型錯誤。這有助于在早期發現潛在的問題。
- 類型推斷:TS 能夠根據上下文自動推斷變量的類型,減少了必須顯式聲明類型的情況。
- 類型注解:可以在變量、函數參數和函數返回值上添加類型注解,以明確它們的類型。
- 接口和類:TS支持面向對象編程的特性,如類、接口和繼承。
- 枚舉類型:TS提供了枚舉類型,這在 JS 中是沒有的,可以用來定義一組命名常量。
- 泛型:泛型允許用戶創建可重用的組件,這些組件可以支持多種類型而不會丟失其原有類型。
- 模塊化:TS 支持模塊,可以幫助組織和維護大型代碼庫。
- 工具支持:TS有很好的編輯器支持,比如自動完成、導航到定義和重構支持。
四、TypeScript的類型系統
TS的類型系統是該語言的核心特性之一,它在 JS的基礎上添加了類型注釋和靜態類型檢查。這意味著你可以在編碼階段指定變量、函數參數和返回值的類型,這樣 TS 編譯器就可以在代碼運行之前檢測到潛在的類型錯誤。
1、什么是類型注釋?
在TS中,類型注釋是一種輕量級的方式來記錄函數或變量的期望類型。類型注釋可以幫助開發者理解代碼應如何使用,同時也允許TS編譯器檢查類型錯誤。
類型注釋通常跟在變量名后面,使用冒號和空格分隔,然后是類型名稱。下面是一些基本的類型注釋示例:
作用:為變量添加類型約束。比如,上述例子中:name
?是一個類型為?string
?的變量;age
?是一個類型為?number
?的變量;isActive
?是一個類型為?boolean
?的變量;
函數?greet
?接收一個?string
?類型的參數,并返回一個?string
?類型的值;
對象?user
?有兩個屬性,分別為?string
?類型的?name
?和?number
?類型的?age;
數組?numbers
?和?names
?分別包含?number
?類型和?string
?類型的元素;
元組?tuple
?包含一個?string
?類型和一個?number
?類型的元素;
??!!!約定了什么類型,就只能給變量賦值該類型的值,否則,就會報錯。
類型注釋不是JS的一部分,它們在TS代碼被編譯成JS時會被移除。這意味著它們不會影響生成的JS代碼的性能。它們的主要目的是在開發階段提供類型校驗和編輯器支持。
2、類型系統核心 - 常用類型
下面是 TS類型系統的一些基本組成部分:
1)?基本類型(原始類型):? ??
在TS中,基本類型(也稱為原始類型)是構建其他類型的基石。下面是TS中的一些基本類型,這些類型,完全按照 JS 中類型的名稱來書寫。?
-
數字(Number)?
? ? ? ?在TS中,不管是整數還是浮點數,統一使用number
類型表示。它還支持十進制、十六進制、二進制和八進制字面量。
// 數字(Number)類型
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
-
字符串(String)
? ? ? ?字符串數據用于表示文本數據,可以是單引號('
), 雙引號("
)或模板字符串(``)。TS中的文本數據類型是string
。
// 字符串(String)
let name: string = "letu";
name = '樂途';
let sentence: string = `Hello, my name is ${ name }.`;
-
布爾值(Boolean)
? ? ? 布爾值是最基本的數據類型,在TS中,它表示邏輯上的真(true)或假(false)。只有兩個值:true
和false,
它通常用于控制條件語句,如if
語句。
// 布爾值(Boolean)
let isDone: boolean = false;
isDone = true
-
Null 和 Undefined?
? ? ? ?在TypeScript中,
null
和undefined
是所有類型的子類型。這意味著你可以將null
和undefined
賦值給像number
或string
這樣的類型。但是,當你使用--strictNullChecks
標志時,null
和undefined
只能賦給any
和它們各自的類型(這意味著undefined
只能賦給undefined
類型,null
只能賦給null
類型)
Undefined:undefined
類型代表未定義的值。在JavaScript中,如果你聲明一個變量但沒有給它賦值,那么它的值就是undefined
。在
let notAssigned: undefined; // 變量沒有賦值,只定義了類型為undefined
console.log(notAssigned); // 輸出 "undefined"
TypeScript中,通常不會直接使用undefined
類型,因為這限制了變量只能被賦予undefined
值。
Null:
null
類型表示沒有任何對象值。在JavaScript中,null
通常被用來表示一個意料之中的缺失值。
let emptyValue: null; // 變量被賦予null類型
emptyValue = null; // 合法的賦值
和undefined
一樣,直接使用null
類型不是特別有用,因為這樣變量除了null
之外不能賦予任何其它值。但是,你可以通過聯合類型來指定一個變量可能是null
。
當啟用--strictNullChecks
時,null
和undefined
的行為會更加嚴格。任何不顯式包含null
或undefined
的類型都不能被賦予這些值。
let strictString: string;
strictString = null; // 錯誤,不能將類型“null”分配給類型“string”
strictString = undefined; // 錯誤,不能將類型“undefined”分配給類型“string”
-
Symbol
symbol
類型是ECMAScript 2015的新特性,symbol
是不可改變且唯一的。常用來作為對象屬性的鍵。let sym1 = Symbol(); let sym2 = Symbol("key"); // 可選的字符串key
symbol
類型的值是通過Symbol
構造函數創建的。每個symbol
都是唯一的。即使你用相同的字符串來創建兩個symbol
,它們也是不相等的。let sym3 = Symbol("key"); let sym4 = Symbol("key"); console.log(sym3 === sym4); // 輸出 "false"
symbol
類型的主要用途之一是作為對象屬性的鍵,這些屬性不會與其他屬性沖突,并且不會被通常的方法(如Object.keys
或for...in
循環)枚舉到。let obj = {[sym1]: "value" }; console.log(obj[sym1]); // "value"
2. 數組:
? ?- `type[]`: 表示一個元素類型為 `type` 的數組。
? ?- `Array<type>`: 另一種表示數組的方式。
3. 元組:
? ?- `[type1, type2]`: 表示一個已知元素數量和類型的數組,各元素的類型不必相同。
4. 枚舉:
? ?- `enum`: 用于定義一組命名常量。
5. 任意類型:
? ?- `any`: 可以是任何類型,TypeScript 不會對這些變量進行類型檢查。
6. Void:
? ?- 用于表示沒有任何類型,通常用于函數沒有返回值的情況。
7. Never:
? ?- 表示永遠不存在的值的類型,例如,一個拋出異常或永不返回的函數的返回類型。
8. 聯合類型:
? ?- `type1 | type2`: 表示一個值可以是 `type1` 或 `type2`。
9. 交叉類型:
? ?- `type1 & type2`: 表示一個值同時是 `type1` 和 `type2`。
10. 類型別名:
? ? - `type Name = ...`: 創建一個新名字來引用某種類型。
11. 接口:
? ? - `interface`: 定義對象類型,可以包括屬性和方法的類型定義。
12. 泛型:
? ? - 允許在定義函數、接口、類時不預先指定具體的類型,而是在使用時再指定類型的特性。
疑問
1、--strictNullChecks標志是什么?
--strictNullChecks
?是 TypeScript 編譯器的一個選項。當這個標志被啟用時,編譯器會更加嚴格地檢查?null
?和?undefined
?值,以避免可能的運行時錯誤。
在沒有啟用?--strictNullChecks
?的情況下,所有類型都隱式地包含?null
?和?undefined
?值。這意味著如果你有一個類型為?string
?的變量,那么它實際上可以被賦予?string
、null
?或?undefined
?值。
let myString: string;myString = null; // 沒有錯誤,即使在沒有 --strictNullChecks 的情況下
myString = undefined; // 沒有錯誤
然而,當啟用了?--strictNullChecks
?后,null
?和?undefined
?只能賦給它們各自的類型和?any
?類型,或者是明確聲明為可選的類型。這樣做可以避免很多常見的錯誤,比如在一個對象上調用方法之前沒有正確地檢查對象是否為?null
。
let myString: string;myString = null; // 錯誤: Type 'null' is not assignable to type 'string'.
myString = undefined; // 錯誤: Type 'undefined' is not assignable to type 'string'.
如果你想要一個變量既可以是?string
?類型也可以是?null
?或?undefined
,你需要使用聯合類型明確聲明:?
let myString: string | null | undefined;myString = null; // 正確
myString = undefined; // 正確
啟用?--strictNullChecks
?是一個很好的實踐,因為它可以幫助開發者在編譯階段捕獲可能的空值錯誤,而不是在代碼運行時才發現
2、--strictNullChecks標志默認是啟動的嗎?如何關閉
截至我知識更新的時間點(2023年),在 TypeScript 中,--strictNullChecks
?標志默認是關閉的。如果你創建一個新的 TypeScript 項目,這個選項不會自動啟用;你需要在?tsconfig.json
?文件中明確地設置它。
要啟用?--strictNullChecks
,你需要在項目的?tsconfig.json
?文件中設置?compilerOptions
?部分,如下所示:
{"compilerOptions": {"strictNullChecks": true}
}
如果你想要關閉這個標志(假設它已經被啟用),你需要在?tsconfig.json
?中將它設置為?false
:
{"compilerOptions": {"strictNullChecks": false}
}
注意,關閉?--strictNullChecks
?可能會使你的代碼更容易出現運行時錯誤,因為你可能會遺漏對?null
?和?undefined
?的必要檢查。然而,在某些情況下,例如當你遷移舊的 JavaScript 項目到 TypeScript 時,你可能需要暫時關閉這個選項,以便逐步解決類型問題。?
總結
TypeScript是一種由Microsoft開發的開源編程語言,它是JavaScript的一個超集,主要提供了類型系統和對ES6+的支持。TypeScript設計的目的是開發大型應用程序,并且能夠編譯成純JavaScript。下面是TypeScript官方文檔的一些關鍵點總結:
類型系統:TypeScript的核心特性之一是它的類型系統。類型系統允許你在編寫代碼時定義變量、函數參數和對象屬性的類型。這有助于捕捉錯誤,提供代碼自動完成和智能提示等功能。
類型推斷:TypeScript能夠在沒有明確類型注釋的情況下推斷出表達式的類型,這稱為“類型推斷”。
接口:接口是TypeScript的一個重要概念,用于定義對象的形狀,包括它應該包含哪些屬性和方法。
類:TypeScript支持基于類的面向對象編程。你可以創建類、繼承和實現接口,這些都是靜態類型檢查的。
泛型:泛型允許你創建可重用的組件,這些組件可以支持多種類型而不會丟失其原始類型。
枚舉:枚舉是一種特殊的類型,它允許你定義一組命名的常量。
模塊:TypeScript支持模塊,這意味著你可以將代碼分割成可重用的模塊。
命名空間:命名空間是另一種在TypeScript中組織代碼的方法,它們可以幫助你防止全局作用域的污染。
裝飾器:裝飾器是一種特殊類型的聲明,它可以被附加到類聲明、方法、訪問器、屬性或參數上。裝飾器使用`@expression`這種形式,`expression`必須求值為一個函數,它會在運行時被調用。
工具鏈:TypeScript提供了一系列工具,包括編譯器`tsc`和語言服務,它們可以幫助你編譯、檢查和重構TypeScript代碼。
編譯器選項:TypeScript編譯器`tsconfig.json`文件中有許多配置選項,允許你定制編譯過程。
與JavaScript的互操作性**:TypeScript旨在與現有的JavaScript代碼庫和框架兼容。你可以在TypeScript項目中使用JavaScript代碼,并且可以逐步遷移JavaScript代碼到TypeScript。
TypeScript官方文檔包含了從基礎到高級的所有概念,還有關于如何使用TypeScript的詳細指南,以及如何配置和管理TypeScript項目的信息。這些文檔是學習和使用TypeScript的重要資源。