前言:
自學第一天,什么是TS ,為什么要用 TS
TS 全程 Typed JavaScript at Any Scale 解釋起來就是 添加了型別系統的 JavaScript, 是 JavaScript 的一個超集
讓 JS 從動態型別的語言,變成了一個靜態型別的語言,給變數賦予了型別
好,到這里有同學就會問了,什么是動態型別,什么是靜態型別,啥是給變數賦予型別?讓我們來看下邊這一個栗子:
let a ;
a = "a";
a = 10;
我們先來看第三步,10 是有型別的吧,型別是 number ,第二步也同理,此時回過頭來,我們再看第一步,a 是什么型別?
a 在第一步的時候,沒有型別, 就是一個變數
這就是 JS 中的動態型別,a 什么都可以存放,TS 就不同 你 let 了一個 String 型別的 a ,你就只能存放 String 型別
PS:擴展
有的同學就會說了,這樣動態型別怎么了,很方便啊,啥都能放不好嗎?
對,是很方便,靈活,但卻是一把雙刃劍,我們舉個栗子:
funtion fun(a,b){
.....
}
我們給 fun 傳了倆引數一個 a,一個 b 這時候 a 和 b 有型別嗎,也沒有型別
問題這就來了
假如這時候我要算一個加法,就是想要 a 和 b 加一塊的數值,按理來說我們做加法,傳的時候就該傳數字了,但 JS 這一塊你愛傳傳啥,我不管,隨便你傳
如果這時 a 和 b 這倆值又在別處 經歷了其他運算,這時候 JS 會把這個錯誤埋起來,我不立刻報錯
假如我們的這個運算是在第三行寫的,他不立刻報錯可能在三千行,三萬行在報錯,那維護成本,誰找錯誰知道...
最后上圖:


總結一下上圖的內容,TS 是以 JS 為基礎搭建的語言,是一個 JS 的超集,
可以在任何支持 JS 的平臺中執行,也就是說 TS 完全兼容 JS
不能被 JS 決議器直接執行,TS 不能直接被瀏覽器識別需要編譯成 JS
TS 擴展了 JS ,但不能取代 JS
開發環境:
好了介紹了這么多,大家都對 TS 有了一個基本的概念了吧,現在我們第一天的正式學習
首先要想寫 TS 我們第一件事就是要搭建一個 TS 的開發環境,用 Node.js 來決議 TS
1. 下載 Node.js
地址 : http://nodejs.cn/download/
2. 安裝 Node.js
3. 使用 npm 全域安裝 TypeScript :
npm install -g typescript

安裝完之后輸入 tsc 出一堆 不報錯就代表安裝完成了 接下來讓我們開始寫吧


首先我們在創建一個后綴名為 ts 的檔案,然后隨便用什么東西打開寫一段 js 代碼 因為 ts 是完全兼容 js 的
所以我們這里就寫一個簡單的 console
ts 檔案是不能被網頁識別的 這時候就要進行編譯了


基本型別宣告:
我們都知道 JavaScript 的型別分為兩種:一種是原始資料型別(Primitive data types)另一種是物件型別(Object types)
現在我們來看原始資料型別,也就是布林值,數值,字串,null,nudefined 在 TS 中如何宣告


如圖,let a :number 之后 ,在以后的使用程序中 a的值 只能是數字,如果賦值字串的話,會明確的告訴你錯誤資訊
當然,我們也可以直接這樣宣告并賦值:
let a : number = 10 ;
但這種語法在實際我們寫 TS 程序中是不常用的,TS的變數宣告和賦值是同時進行的,TS可以自動對變數進行型別檢測

型別宣告也可以用于函式上邊
JS 中的函式是不考慮引數的型別和個數的

TS 中


當然 TS 相對嚴格你傳多傳少也是會報錯的



你也可以給函式的回傳值添加型別,比如


其他基本型別:
| 型別 | 例子 | 描述 |
|---|---|---|
| number | 1, -33, 2.5 | 任意數字 |
| string | 'hi', "hi", hi |
任意字串 |
| boolean | true、false | 布林值true或false |
| 字面量 | 其本身 | 限制變數的值就是該字面量的值 |
| any | * | 任意型別 |
| unknown | * | 型別安全的any |
| void | 空值(undefined) | 沒有值(或undefined) |
| never | 沒有值 | 不能是任何值 |
| object | {name:'孫悟空'} | 任意的JS物件 |
| array | [1,2,3] | 任意JS陣列 |
| tuple | [4,5] | 元組,TS新增型別,固定長度陣列 |
| enum | enum{A, B} | 列舉,TS中新增型別 |
上邊我們演示了前三個,接下來我們來看后邊
字面量
什么是字面量,廢話不多說直接上圖

此時的 a 只能是 數字 10 ,當然這種是不常用的,我們一般都這樣使用,取一個字面量的范圍,我也叫這種為(聯合型別)


當然聯合型別不只用于字串,我們也可這樣

any
any的意思就是隨便,愛啥啥

注意的一點是,一個變數設定為 any 后(顯示的 any ),就相當于該物件關閉了 TS 的型別檢測,使用 TS 時候不建議使用 any
當然這還不最可怕的一點,最可怕的是

此時的 d 型別 還是 any ,所以宣告變數如果不指定型別,則 TS 決議器會自動判斷變數的型別為 any (隱式的 any )
雖然不建議使用,但代碼是死的,人是活的,因為 JS 是靈活的,在一些開發的程序中,你就是不知道那個值是什么,或者說是不確定,這時我們可以用 any 或 unknown
unknown
字面意思很明顯,unknown --> 我不知道 ,也是表示未知型別的值


這時就有人問了,誒六扇老師,這和 any 一樣啊,沒什么區別啊
別急,看圖,區別這就來了


我們來看,變數 s 是 string 型別,而 變數 d 是 any 值是 字串10 卻成功賦值沒有報錯,也就是說這玩意不止霍霍自己,還霍霍別人
而 unknown 就不一樣了
unknown 實際上就是一個型別安全的 any ,unknown 型別的變數,不能直接賦值給其他變數
這會又會有人問了,六扇老師,我就想讓 unknown 賦值給 s 怎么辦?
第一種方法,在前邊加上一個型別判斷
用 typeof 判斷 e 是不是 string 是的話 賦值

方法二,在 TS 里面有一個叫 型別斷言,先別管什么意思,我們直接看圖

空值(Void)
JS里面是沒有 Void 的概念, 在 TypeScript 中,可以用 Void 表示沒有任何回傳值的函式
上文我們也說了,我們也可以給函式設定回傳值的型別,在某些情況下我們寫的函式是沒有回傳值的,此時就用到了 Void

never
和空不一樣,其實沒有回傳值,也是一種回傳,never是表示永遠不會回傳結果
在我們寫代碼的時候,有一種函式是用來處理報錯,不會回傳直接報錯,就可以用never

不常使用,了解就行
復雜的型別,object

我們可以跟上邊設定型別一樣,也可給 a 設定一個 object 型別,但這種不常用,通常我們都直接給后邊加 { } 來設定型別
{ } 也可以用來指定物件可以包含哪些屬性,比如這時的 b 只能給它賦值 物件且里面帶有 name 是 string 型別的,多一個不行,少了也不行
那六扇老師,我就想添加屬性怎么辦?
看下圖


在屬性名后邊加上 ?代表可選屬性,就是有沒有都行的屬性,可加,可不加
效果是達到了,但好麻煩啊,六扇老師我就想 name 是固定值,后邊不管,愛怎么加怎么加行不?
好,這位同學很會問問題,看完下圖之后叉出去

[propName:string] 表示 我這個屬性是字串型別, propName 不是固定的,可以隨便寫,比如放個 xxx 也是行得通的
:any 表示任意型別
那回過頭再看代碼,這段代碼的意思就是除了 name 是 字串型別以外,后邊其他的我不管,隨便
其實和前邊提到的字面量差不多,都是給一個限制
還有一種寫法是設定函式結構的型別宣告:

陣列
和物件一樣,我們不是要什么物件,而是要存放什么型別的陣列

還有一種語法,在后邊加 Array<string>


以上就是我們 JS 里面的資料型別,下邊我們來講倆不一樣的 TS 中新增的型別
tuple(元組)
什么意思呢,就是固定長度的陣列

當陣列里面的值是固定的時候,用元組是最好的選擇,性能上會強一點
enum 列舉


在我們存盤資料的時候,我們盡可能的希望資料小,像性別這種,除了男或者就是女這種值我們可以用 0 或 1 代替,但資料確實笑了,方便了,麻煩來了
這個值是我們定義的,我們知道,但別人不知道啊,這時就要用到 enum(列舉) 定義一個列舉類
我們 enum 了一個 Gender 里面 Male 表示男,Female 表示女,寫不寫 0 或者 1 沒區別,因為判斷的時候,就用 j 里面的 gender 是否等于 Gender 里面的值
就是把我們的一些固定選項都給列出來,單獨放一個類里面,然后使用
擴展
型別別名:
假如我們需要倆個變數 ,他們倆的型別是一樣的,特別長

以上就是我們常見的型別,所以一定要反復的去看,去練熟
好了,想了解更多有趣知識那就關注六扇老師抖音號吧
抖音搜索 六扇有伊人 或者 直接點擊
個人博客鏈接:http://blog.qianbaiyv.cn/get/my/blog/details/2311887075%40qq.com/148
轉載請標明
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/535221.html
標籤:JavaScript
