Typescript筆記之基礎知識(3):TS數據類型

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

個人目前能力有限,並沒有自主構建一個社區的能力,如有任何問題或想法與我溝通,請通過上述某個平臺聯繫我,謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章