foreword(前言)
就跟學習JS一樣,學習TS首先需要掌握它具有哪些數據類型,本篇文章將記錄TS基本的數據類型。
在TS中,數據類型都有哪些?
TS作爲JS的超集,必然包含JS所有的數據類型,它們分別是:
- Boolean
- Number
- String
- Array
- Function
- Object
- Symbol
- undefined
- null
除此之外,TS還新增了以下的數據類型:
- void
- any
- never
- 元組
- 枚舉
- 其他高級類型玩法
類型註解
在對比分析每種數據類型之前,有必要先了解TS中的類型註解。它相當於強類型語言中的類型聲明,作用和C語言中“int a = 1”的int聲明一樣,具體語法如:(變量/函數):type
,即在變量名後面加一個“類型”,如:
let n: number = 100
通過添加類型註解之後,我們就不能隨便將其他類型的數據賦值給當前變量了,比如上面的n,我們不能將字符串賦值給它,不然vscode將會給我們格式高亮報錯Type '"xxx"' is not assignable to type 'number'.
原始類型
JS中最基礎的三個數據類型Boolean、Number、String的聲明方式如下:
let bool: boolean = true
let num: number = 1
let str: string = 'handsome boy'
數組
數組在TS中的聲明方式是這樣的:
// 方式一
let arr1: number[] = [1, 2, 3]
// 方式二
let arr2: Array<number> = [1, 2, 3]
從上面我們可以發現的是,和原生的js相比,數組中每個元素的類型都在聲明的時候已經綁定好了,所以如果其中插入一些非數字類型的數據,編輯器將會報錯。
那如果要使得在數組中可以插入其他類型的數據呢,則可以採用聯合類型的方式,比如:
let arr: Array<number | string> = [1, 'abc']
這樣,數組就能包含多種數據類型了
元組
元組是一種特殊的數組,它控制了數組成員的類型和數量,比如:
let tuple: [number, string] = [1, 'abc']
上面代碼就控制了三個條件:
- 數組第一個元素是數字類型;
- 數組第二個元素是字符串類型;
- 數組中只能有兩個元素;
接下來我們來看下元組的越界問題:
let tuple: [number, string] = [1, 'abc']
tuple.push(2)
console.log(tuple) // [1, "abc", 2]
tuple[2] // 編輯器會報錯
雖然元組可以通過push方法添加新元素,但是元組仍然無法訪問剛添加的新元素。
函數
函數的聲明需要給參數添加類型註解,如下:
let add = (a: number, b: number) => a + b
或者
let add = (a: number, b: number): number => a + b // 最後的這個number是對函數返回值類型的註解,不過平時可以省略(TS的類型推斷)
函數的聲明還有一種形式:(先聲明後實現)
let add: (a: number, b: number) => number
add = (n, m) => n + m
這種方式在實現時可以不寫註解,參數名也可以和聲明時不一樣。
對象
按照JS的用法,或許我們覺得可以如下方式聲明與操作對象:
let obj: object = { x: 1, y: 2 }
obj['x'] = 2 // 報錯,ts中不知道你聲明的對象中有x屬性
Ts中應該這樣做:
let obj: {x: number, y: number} = {x: 1, y: 2}
obj.x = 2
Symbol
let s1: symbol = symbol()
或者
let s2 = symbol()
undefined、null
當一個變量被聲明成undefined或null,該變量只能被賦值undefined或者null:
let undef: undefined = undefined
let nul: null = null
在ts官網中,undefined和null是任何類型的子類型,說明undefined和null可以賦值給任何其他類型,但不能直接賦值:
/* 會報錯 */
let num: number
num = undefined
num = null
要使得上面代碼不報錯,需要修改下ts的配置文件:
...
"strictNullChecks": false, /* Enable strict null checks. */
...
或者,如果想要用比較嚴格的語法,可以使用聯合類型,比如:let num: number | undefined | null
void
在js中,void是一種操作符號,可以讓任何表達式返回undefined,比如最簡單的一種返回undefined的方式爲void 0
。(注:undefined不是js中的保留字,完全可以通過一個undefined變量覆蓋,比如:(function () {var undefined = 111; console.log(undefined)})()),在全局聲明是沒效果的
)
在ts中,void的意思是“沒有返回值”,通常用來標示函數沒有返回值(可以理解爲函數沒有return),個人理解爲它是一種“標示”,和C語言中的void是類似的。
any
any即任何類型,ts中只要不指定類型註解即可。
never類型
這個類型和void有些相似,也是不返回值,標示函數,比如:
let error = () => {
throw new Error('error')
}
let endless = () => {
while (true) {
console.log(111)
}
}
通俗理解void與never:
- void可以理解爲一個沒有return但能執行完畢的函數;
- never是一個函數體無法結束執行的函數;
枚舉類型
enum ConstEnum {
a,
b,
c,
d
}
enum StrEnum {
a = 'a',
b = 'b'
}
enum ComplexEnum {
a,
b = 'b'
c = 1 // 只要前一個枚舉成員爲非數字類型,那邊就要賦值
}
相同枚舉類型或以相同枚舉成員作爲類型的數據才能進行比較。
last(最後)
非常感謝您能閱讀完這篇文章,您的閱讀是我不斷前進的動力。對於上面所述,有什麼新的觀點或發現有什麼錯誤,希望您能指出。
最後,附上個人常逛的社交平臺:
知乎:https://www.zhihu.com/people/bi-an-yao-91/activities
csdn:https://blog.csdn.net/YaoDeBiAn
github: https://github.com/yaodebian
個人目前能力有限,並沒有自主構建一個社區的能力,如有任何問題或想法與我溝通,請通過上述某個平臺聯繫我,謝謝!!!