TypeScript 基礎類型

基礎類型

基礎類型能夠依據是否含有類型關鍵字分爲兩類:ajax

  • 含:booleannumberstringsymbolobjectnullundefinedanynever
  • 不含:數組、元組、枚舉

注意:全部類型關鍵字都是小寫的。數組

注:這種分類並不嚴謹,分類的目的僅僅用於幫助記憶

聲明格式

類型用來指定變量的類型,兼容的類型之間才能進行賦值、傳參等操做。
聲明變量類型使用 變量名: 類型 格式,如 let decimal: number = 10,聲明以後 decimal 就只能接受 number 類型的賦值,不然編譯器會報錯。函數

Array

變量聲明爲數組類型時,還須要指定數組元素類型,有如下兩種等效方式:oop

  • let list: number[] = [1, 2, 3]
  • let list: Array<number> = [1, 2, 3]

若是數組元素類型有多種呢?那就須要使用元組(Tuple)。code

Tuple

元組能夠指定固定索引位置的數組元素類型。對象

let x: [string, number] 表示第 0 位和第 1 位分別是 stringnumber 類型,第 2 位及以後能夠是 string number,即前面全部索引位的類型之一。索引

Enum

枚舉類型能夠更加友好地定義數值集合接口

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 表示任意類型,聲明爲 any 的變量能夠賦予任意類型的值。

那是否是等於沒有類型檢測了?

之因此存在這種類型,緣由有兩個:

  1. 寫代碼時開發者也不是很明確要用哪一種類型,或者只知道部分類型
  2. 兼容用戶輸入或者第三方庫

緣由 2 中,好比應該把 jQuery 對象聲明爲何類型呢?
固然,能夠像其餘語言中同樣聲明爲 Object,如 let $: Object = jQuery,這樣賦值是沒問題的。
在 JS 中一切皆爲對象,因此給聲明爲 Object 的變量賦值任何值。
可是當調用函數時,好比 $.ajax(),編譯器卻會報錯說找不到 ajax() 函數,即便 jQuery 上有該方法。
可是聲明爲 any 卻不會,由於編譯器並不會對它進行檢查。

注意:Object 是 TS 內置的接口類型,object 是基礎類型,let a: object; 等效於 let a: {}

Void

voidany 相反,表示不能出現任意類型,多用於定義無返回值的函數。

function warn(): void {
  alert('warning');
}

若是用於聲明變量,那麼只能接受 undefinednull,這樣的聲明實際上是沒啥用途的。

let unusable: void = undefined;

Null 和 Undefined

nullundefindedvoid 同樣,定義類型自己是沒啥用途的,可是須要注意的是,他們是其餘任何類型(包括 void)的子類型。所以,能夠把 null 賦值給 number 類型,let decimal: number = null

可是,不建議這種用法,能夠使用 --strictNullChecks 選項來關閉。這樣的話,nullundefined 就只能賦值給 void 和它們自己。

Never

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 類型:

  • angle-bracket-syntax: (<string>anyTypeValue).length
  • as-syntax: (anyTypeValue as string).length

推薦使用 as 語法,由於當 TS 與 JSX 一塊兒使用時,只容許 as 語法。

相關文章
相關標籤/搜索