概述
Javascript沒有強制的類型檢查,不同類型的變量可以互相賦值,因此可能會引發一些因爲類型匹配而發生的問題。Typescript的變量都具有類型,包括基本類型和複合類型,不同的類型之間不一定兼容。
聲明
要聲明一個變量的類型,需要採用如下的語法:
let a: string = 'a'
其中: string
表示變量a
是一個字符串類型。等號之後表達式的值必須與變量類型兼容,否則編譯器會報錯。
在變量初始化定義語句中,如果沒有聲明等號左邊的變量的類型,編譯器會根據等號右邊變量的類型來推斷等號左邊變量的類型。
示例:
let a = 'a' // a是string類型
let b = 1 // b是number類型
let c = a // c是string類型
c = b // 錯誤。無法將number類型賦值給string類型
類型
Typescript的基本類型有:
- string
- number
- boolean
- symbol
- null
- undefined
- any
- unknown
- never
- void
string, number, boolean, symbol
string
、number
、boolean
、symbol
對應Javascript中包裝類String
、Number
、Boolean
、Symbol
的區別。但是前者是類型,後者本質上是構造函數。
在編程中,應始終使用前者來表示變量的類型。
null, undefined
null
和undefined
被單獨作爲變量類型,與其它類型並不兼容。null
表示空指針,但是不能將null
理解爲其它面嚮對象語言中未實例化的空變量。
any
當一個變量的類型是任意或無法確定時,我們可以聲明它爲any
類型。
any
類型變量可以賦值給任意類型的變量,也可以被賦值爲任意類型變量。可以讀取它的任意屬性(即使不存在),讀取的屬性也是any
類型。
編譯器不會對any
類型變量做類型檢查,因此有時候可能有風險,在一些語法檢查工具(如ESLint)常常不允許使用any
。
示例:
let a: any = 0
let b: number = a
let c: string = a
let d = a.value
a = 'a'
unknown
爲了彌補any
過於寬泛和自由的弊病,但同時有需要一種表示未知的類型,unknown
出現了。
unknown
可以被賦值爲任意類型的變量,但是隻能賦值給unknown
或any
類型的變量,同時也不能讀取它的任何屬性。
示例:
let a: unknown = 0
let b: number = a // 錯誤
let c: string = a // 錯誤
let d = a.value // 錯誤
a = 'a' // 合法
它的作用之一是預先聲明一個不確定類型的變量,等到實際使用時再轉換類型。示例:
let a: unknown // 聲明
a = 'a' // 賦值
let b:string = a as string // 使用
也可以作爲兩種無法兼容的類型轉換時的中間類型(這種操作可能有風險)。示例:
let a:string = (0 as unknown) as string
有關類型轉換的內容將在之後介紹。
never
never
表示正常情況下無法到達的類型,比如拋出異常的函數:
function error(): never {
throw new Error('error')
}
void
void
表示空類型,通常用在沒有返回值的函數上。
示例:
function log(arg: string): void{
console.log(arg)
}