基礎類型能夠依據是否含有類型關鍵字分爲兩類:ajax
boolean
、number
、string
、symbol
、object
、null
、undefined
、any
、never
注意:全部類型關鍵字都是小寫的。數組
注:這種分類並不嚴謹,分類的目的僅僅用於幫助記憶
類型用來指定變量的類型,兼容的類型之間才能進行賦值、傳參等操做。
聲明變量類型使用 變量名: 類型
格式,如 let decimal: number = 10
,聲明以後 decimal
就只能接受 number
類型的賦值,不然編譯器會報錯。函數
變量聲明爲數組類型時,還須要指定數組元素類型,有如下兩種等效方式:oop
let list: number[] = [1, 2, 3]
let list: Array<number> = [1, 2, 3]
若是數組元素類型有多種呢?那就須要使用元組(Tuple)。code
元組能夠指定固定索引位置的數組元素類型。對象
如 let x: [string, number]
表示第 0 位和第 1 位分別是 string
和 number
類型,第 2 位及以後能夠是 string
或 number
,即前面全部索引位的類型之一。索引
枚舉類型能夠更加友好地定義數值集合。接口
enum Color { Red, Green, Blue } let c: Color = Color.Red;
枚舉類型默認從 0 開始遞增標記成員,也能夠顯式標記部分或者全部成員。部分標記時,未標記成員按前向最近顯式標記值遞增。ci
enum Color { Red = 1, Green, Blue } // 部分標記時,自動遞增,所以 Green => 2, Blue => 3 enum Color { Red = 1, Green = 2, Blue = 4 }
一個很好用的功能是,枚舉能夠反向查詢枚舉成員名稱,如:開發
enum Color { Red = 1, Green, Blue } console.log(Color[2]) // => Green
any
表示任意類型,聲明爲 any
的變量能夠賦予任意類型的值。
那是否是等於沒有類型檢測了?
之因此存在這種類型,緣由有兩個:
緣由 2 中,好比應該把 jQuery
對象聲明爲何類型呢?
固然,能夠像其餘語言中同樣聲明爲 Object
,如 let $: Object = jQuery
,這樣賦值是沒問題的。
在 JS 中一切皆爲對象,因此給聲明爲 Object
的變量賦值任何值。
可是當調用函數時,好比 $.ajax()
,編譯器卻會報錯說找不到 ajax()
函數,即便 jQuery
上有該方法。
可是聲明爲 any
卻不會,由於編譯器並不會對它進行檢查。
注意:Object
是 TS 內置的接口類型,object
是基礎類型,let a: object;
等效於 let a: {}
。
void
與 any
相反,表示不能出現任意類型,多用於定義無返回值的函數。
function warn(): void { alert('warning'); }
若是用於聲明變量,那麼只能接受 undefined
和 null
,這樣的聲明實際上是沒啥用途的。
let unusable: void = undefined;
null
和 undefinded
跟 void
同樣,定義類型自己是沒啥用途的,可是須要注意的是,他們是其餘任何類型(包括 void
)的子類型。所以,能夠把 null
賦值給 number
類型,let decimal: number = null
。
可是,不建議這種用法,能夠使用 --strictNullChecks
選項來關閉。這樣的話,null
和 undefined
就只能賦值給 void
和它們自己。
never
表示這種類型的值永遠不會出現。聽起來很奇怪,可是它確實有應用場景。
最大的場景就是用在函數返回值中,如:
function error(msg: string): never { throw new Error(msg); } function fail() { return error('failed'); }
function infiniteLoop(): never { while(true) {} }
TS 編譯器會按照聲明規則自動檢查變量類型,免去了開發者本身檢查的煩惱。可是做爲規則,它是固定死的,有時也須要靈活「通融」一下。
類型斷言就是一種「通融」方式,實質上是一種類型轉換(Type Cast),它告訴編譯器「相信我,我知道我在作什麼,我爲個人行爲負責」,而後編譯器就會把它認爲是目標類型。
類型斷言有兩種語法形式,下例中都是將變量 anyTypeValue
轉爲 string
類型:
(<string>anyTypeValue).length
(anyTypeValue as string).length
推薦使用 as
語法,由於當 TS 與 JSX 一塊兒使用時,只容許 as
語法。