TS 自學筆記(一)
本文寫于 2020 年 5 月 6 日
日常廢話兩句
有幾天沒有更新了,最近學的比較亂,休息了兩天感覺好一些了,這兩天玩了幾個設計軟體,過幾天也寫篇文章分享分享,
為啥要學 TS?
進入正題哈,經常寫 JS 的人會特別多的碰到一個 bug:xxxx is not a function之類的,
這是為什么呢?
其實就是我們用了一些不屬于它的方法,
比如說我們有一個const a = 250,然后我們讓他a.filter(()=>{}),
有人可能會說,那明明是一個 number 型別,我怎么可能給他 filter 呢?
我之前就犯過這個錯誤,我想讓一個陣列等于另一個被 push 一個新元素陣列:
let newArr = arr.push('hello');
newArr.filter(() => {});
要知道,arr.push 的回傳值是新的陣列長度!讓一個 number 型別去使用陣列方法,自然是會報錯的,
好吧,我知道這樣似乎非常愚蠢,但是總而言之,在日常寫 JS 的報錯中,有大把大把的錯因都是這種完全可以避免掉的問題,
如果是 Java 或是 C#,編輯器在還沒運行時就給會你劃上紅線,不會等到你運行了再去告訴你你錯了,
這就是動態語言的毛病,
所以我們需要學習 TypeScript,用它來構建應用,節省時間,據說用了 TS,能有效減少 80%的 Bug(笑)
不管這是不是真的,從各個大框架對于 TS 的青睞程度來看,未來幾年內,TS 必然會是絕對的熱點之一!Angular 早早的就從 Angular.js 變成了 Angular(必須使用 TS);React 對 TS 極其友好;Vue3 也開始使用 TS 重寫,
畢竟,現在已經不只是:
能被 JS 改寫的終將被 JS 改寫
而是:
能被 TS 改寫的,終將被 TS 改寫
01 變數型別
JS 是弱型別語言,TS 卻不是,TS 擁有這些型別:
1. undefined
2. null
3. boolean
4. number
5. string
6. object
7. array
----??JS 有的,??JS 沒有的----
8. tuple
9. enum
10. any
11. void
12. never
注:對于 JS 來說,陣列就是 Object 型別,并且在 JS 中資料型別并不是小寫,而是大寫,
在 2020 年,JS 的資料型別增加了 BigInt 和 Symbol 兩種,
number、string、boolean 沒有什么特別好說的,和 JS 沒什么區別,我來寫幾個我覺得比較重要的,
陣列的宣告
let list: number[] = [1, 2, 3];
let list_b: Array<number> = [1, 2, 3];
第一種方法不難理解,就是生命一個 number 陣列,
第二種方法叫做陣列泛型,即Array<元素型別>,
什么叫做泛型呢?
如果我們有一個函式:
function identity(arg: number): number {
return arg;
}
那這個時候,傳入的變數就必須是數字,
考慮到可復用性的問題,我們可以使用泛型,
function identity<T>(arg: T): T {
return arg;
}
identity 函式叫做泛型(注意,T 不是泛型!),因為它可以適用于多個型別,
T 是型別變數,它是一種特殊的變數,只用于表示型別而不是值,它可以幫助我們捕獲用戶傳入的型別,讓我們可以對這個型別加以利用,
如果我們不確定傳入的引數型別,我們是完全可以通過 any 來實作的,但是 any 就會讓我們丟失 T 這一資訊,
enum 是成組常量的好用法!
enum Hello {
teacher: "老師好",
classmate: "同學好",
parents: "爸爸好",
girlfriend: "劉好"
}
一般情況,列舉型別會自動賦給自己常量值:
enum Hello {
teacher, // 0
classmates, // 1
parents, // 2
girlfriend // 3
}
我們也可以從中間打斷這個賦值:
enum Hello {
teacher, // 0
classmates, // 1
parents = 5, // 5
girlfriend // 6
}
接下來會進行順延,
從來沒有的 Never 值
never 型別表示的是那些永不存在的值的型別,聽起來就像個悖論——我如何列舉一個不存在的值?
其實never 型別可以是拋出的例外,或根本就不會有回傳值的函式的回傳值型別,
function error(message: string): never {
throw new Error(message);
}
function fail() {
return error('Something failed');
}
function infiniteLoop(): never {
while (true) {}
}
總體來講大同小異,TS 補充了一些在別的語言中有過的常見資料型別,相信這一塊對于 JS 開發者來說,不會是什么難題,
唯一的難題就是習慣,可不能老是使用 any 型別!
PS: 在命名變數的時候有一個小坑,變數名不能命名為name,因為會與 DOM 中的全域 window 物件下的 name 屬性出現重名,
(未完待續)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/98465.html
標籤:JavaScript
